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

Artifact 926d122e87dcd82b3bb1c2fd5879163abc957916ae168ee91017ccd459fe58d5:


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 20 26 26 20 70 2d 3e 69 52 69 67 68  oin) && p->iRigh
31e0: 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62  tJoinTable==iTab
31f0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  le ){.      Expr
3200: 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
3210: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
3220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3230: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3240: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3250: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
3260: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
3270: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
3280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
3290: 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d  unsetJoinExpr(p-
32a0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
32b0: 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Expr, iTable);. 
32c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
32d0: 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   unsetJoinExpr(p
32e0: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29  ->pLeft, iTable)
32f0: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
3300: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a  ght;.  } .}../*.
3310: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3320: 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f  processes the jo
3330: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  in information f
3340: 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  or a SELECT stat
3350: 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64  ement..** ON and
3360: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
3370: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  re converted int
3380: 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66  o extra terms of
3390: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
33a0: 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f  e..** NATURAL jo
33b0: 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20  ins also create 
33c0: 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75  extra WHERE clau
33d0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  se terms..**.** 
33e0: 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46  The terms of a F
33f0: 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63  ROM clause are c
3400: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
3410: 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75  Select.pSrc stru
3420: 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65  cture..** The le
3430: 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73  ft most table is
3440: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
3450: 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e   in Select.pSrc.
3460: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
3470: 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65  .** table is the
3480: 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68   last entry.  Th
3490: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
34a0: 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65  is held in the e
34b0: 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c  ntry to.** the l
34c0: 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79  eft.  Thus entry
34d0: 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20   0 contains the 
34e0: 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f  join operator fo
34f0: 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65  r the join betwe
3500: 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20  en.** entries 0 
3510: 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f  and 1.  Any ON o
3520: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
3530: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3540: 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20  the join are.** 
3550: 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f  also attached to
3560: 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e   the left entry.
3570: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3580: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
3590: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
35a0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f   encountered..*/
35b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
35c0: 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61  teProcessJoin(Pa
35d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
35e0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69  ect *p){.  SrcLi
35f0: 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20  st *pSrc;       
3600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
3610: 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  l tables in the 
3620: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
3630: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
3660: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
3670: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66  cList_item *pLef
3680: 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74  t;     /* Left t
3690: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
36a0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  d */.  struct Sr
36b0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67  cList_item *pRig
36c0: 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ht;    /* Right 
36d0: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
36e0: 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20  ed */..  pSrc = 
36f0: 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74  p->pSrc;.  pLeft
3700: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a   = &pSrc->a[0];.
3710: 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66    pRight = &pLef
3720: 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  t[1];.  for(i=0;
3730: 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b   i<pSrc->nSrc-1;
3740: 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20   i++, pRight++, 
3750: 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61  pLeft++){.    Ta
3760: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
3770: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
3780: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
3790: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
37a0: 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20 7c 7c  Left->pTab==0 ||
37b0: 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20 29   pRightTab==0) )
37c0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
37d0: 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68 74  sOuter = (pRight
37e0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
37f0: 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20  JT_OUTER)!=0;.. 
3800: 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e     /* When the N
3810: 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69  ATURAL keyword i
3820: 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57  s present, add W
3830: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
3840: 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  s for.    ** eve
3850: 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  ry column that t
3860: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61  he two tables ha
3870: 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20  ve in common..  
3880: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3890: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
38a0: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
38b0: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
38c0: 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74  t->pOn || pRight
38d0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
38e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
38f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e  Msg(pParse, "a N
3900: 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20  ATURAL join may 
3910: 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20 20  not have ".     
3920: 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20        "an ON or 
3930: 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30  USING clause", 0
3940: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3950: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3960: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52     for(j=0; j<pR
3970: 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a  ightTab->nCol; j
3980: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3990: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
39a0: 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  ame of column in
39b0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
39c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
39d0: 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61  iLeft;     /* Ma
39e0: 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c  tching left tabl
39f0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3a00: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d   iLeftCol;  /* M
3a10: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  atching column i
3a20: 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  n the left table
3a30: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
3a40: 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e  me = pRightTab->
3a50: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
3a60: 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65         if( table
3a70: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
3a80: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
3a90: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
3aa0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
3ab0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3ac0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
3ad0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
3ae0: 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , j,.           
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75              isOu
3b00: 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29  ter, &p->pWhere)
3b10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3b20: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
3b30: 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20  * Disallow both 
3b40: 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
3b50: 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65  uses in the same
3b60: 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   join.    */.   
3b70: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
3b80: 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69   && pRight->pUsi
3b90: 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
3ba0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3bb0: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65  se, "cannot have
3bc0: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
3bd0: 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c  NG ".        "cl
3be0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
3bf0: 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20  e join");.      
3c00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3c10: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
3c20: 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ON clause to the
3c30: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
3c40: 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63  E clause, connec
3c50: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e  ted by.    ** an
3c60: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
3c70: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3c80: 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20  ight->pOn ){.   
3c90: 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20 29     if( isOuter )
3ca0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69   setJoinExpr(pRi
3cb0: 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74  ght->pOn, pRight
3cc0: 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
3cd0: 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71    p->pWhere = sq
3ce0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
3cf0: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65  rse->db, p->pWhe
3d00: 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29  re, pRight->pOn)
3d10: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e  ;.      pRight->
3d20: 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  pOn = 0;.    }..
3d30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78      /* Create ex
3d40: 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
3d50: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f   WHERE clause fo
3d60: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61  r each column na
3d70: 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  med.    ** in th
3d80: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20  e USING clause. 
3d90: 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65   Example: If the
3da0: 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62   two tables to b
3db0: 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20  e joined are .  
3dc0: 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64    ** A and B and
3dd0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3de0: 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e  e names X, Y, an
3df0: 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68  d Z, then add th
3e00: 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  is.    ** to the
3e10: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20   WHERE clause:  
3e20: 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e    A.X=B.X AND A.
3e30: 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e  Y=B.Y AND A.Z=B.
3e40: 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20  Z.    ** Report 
3e50: 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
3e60: 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64  column mentioned
3e70: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3e80: 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  ause is.    ** n
3e90: 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
3ea0: 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62  both tables to b
3eb0: 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f  e joined..    */
3ec0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
3ed0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
3ee0: 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d   IdList *pList =
3ef0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b   pRight->pUsing;
3f00: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3f10: 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b  j<pList->nId; j+
3f20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3f30: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
3f40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d  Name of the term
3f50: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
3f60: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ause */.        
3f70: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20  int iLeft;      
3f80: 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65   /* Table on the
3f90: 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63 68   left with match
3fa0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ing column name 
3fb0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3fc0: 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43  LeftCol;    /* C
3fd0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3fe0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3ff0: 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
4000: 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67 68         int iRigh
4010: 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d  tCol;   /* Colum
4020: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
4030: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
4040: 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20  he right */..   
4050: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69       zName = pLi
4060: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
4070: 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43 6f          iRightCo
4080: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
4090: 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65  pRightTab, zName
40a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
40b0: 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20  RightCol<0.     
40c0: 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64      || !tableAnd
40d0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  ColumnIndex(pSrc
40e0: 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69  , i+1, zName, &i
40f0: 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29  Left, &iLeftCol)
4100: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
4110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4120: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
4130: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
4140: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
4150: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
4160: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
4170: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
4180: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4190: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
41a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
41b0: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
41c0: 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20  e, pSrc, iLeft, 
41d0: 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69  iLeftCol, i+1, i
41e0: 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20  RightCol,.      
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4200: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
4210: 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  re);.      }.   
4220: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4230: 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  0;.}../* Forward
4240: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
4250: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
4260: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
4270: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
4280: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
4290: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
42a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
42b0: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
42c0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
42d0: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
42e0: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
42f0: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
4300: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
4310: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
4320: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
4330: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
4340: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
4350: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
4360: 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a  e end */.);../*.
4370: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
4380: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20   that will push 
4390: 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72 65  the record in re
43a0: 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61 0a  gisters regData.
43b0: 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44 61  ** through regDa
43c0: 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f 20  ta+nData-1 onto 
43d0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73  the sorter..*/.s
43e0: 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f  tatic void pushO
43f0: 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72  ntoSorter(.  Par
4400: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4410: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
4420: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74 43  ntext */.  SortC
4430: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
4440: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
4450: 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45 52   about the ORDER
4460: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
4470: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
4480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
4490: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
44a0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ment */.  int re
44b0: 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  gData,          
44c0: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
44d0: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
44e0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
44f0: 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44 61 74    int regOrigDat
4500: 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  a,       /* Firs
4510: 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  t register holdi
4520: 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 70  ng data before p
4530: 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  acking */.  int 
4540: 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  nData,          
4550: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4560: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
4570: 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20 20  data array */.  
4580: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 20  int nPrefixReg  
4590: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66         /* No. of
45a0: 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72 65   reg prior to re
45b0: 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65 20  gData available 
45c0: 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20  for use */.){.  
45d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
45e0: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20 63   /* Stmt under c
4610: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
4620: 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70 53   int bSeq = ((pS
4630: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4640: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4650: 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74 20  ter)==0);.  int 
4660: 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70  nExpr = pSort->p
4670: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4690: 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59 20  No. of ORDER BY 
46a0: 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  terms */.  int n
46b0: 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20 62  Base = nExpr + b
46c0: 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20 20  Seq + nData;    
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
46e0: 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72 20  ields in sorter 
46f0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
4700: 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4730: 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72 20  Regs for sorter 
4740: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
4750: 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70 50  regRecord = ++pP
4760: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4780: 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65 72  Assembled sorter
4790: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
47a0: 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d   nOBSat = pSort-
47b0: 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20  >nOBSat;        
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
47d0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
47e0: 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e 74  to skip */.  int
47f0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64 64  /* Opcode to add
4820: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 74   sorter record t
4830: 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  o sorter */.  in
4840: 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  t iLimit;       
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65   /* LIMIT counte
4870: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
4880: 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d  bSeq==0 || bSeq=
4890: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
48a0: 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67 44  nData==1 || regD
48b0: 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61  ata==regOrigData
48c0: 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61 3d   || regOrigData=
48d0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65  =0 );.  if( nPre
48e0: 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73  fixReg ){.    as
48f0: 73 65 72 74 28 20 6e 50 72 65 66 69 78 52 65 67  sert( nPrefixReg
4900: 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a  ==nExpr+bSeq );.
4910: 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 72 65      regBase = re
4920: 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20  gData - nExpr - 
4930: 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  bSeq;.  }else{. 
4940: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
4950: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
4960: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
4970: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
4980: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
4990: 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >iOffset==0 || p
49a0: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d  Select->iLimit!=
49b0: 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20  0 );.  iLimit = 
49c0: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
49d0: 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   ? pSelect->iOff
49e0: 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d  set+1 : pSelect-
49f0: 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74  >iLimit;.  pSort
4a00: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71  ->labelDone = sq
4a10: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
4a20: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  el(v);.  sqlite3
4a30: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4a40: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4a50: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
4a60: 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a  e, regOrigData,.
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a80: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
4a90: 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67  _ECEL_DUP | (reg
4aa0: 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45  OrigData? SQLITE
4ab0: 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b  _ECEL_REF : 0));
4ac0: 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20  .  if( bSeq ){. 
4ad0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4ae0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
4af0: 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  nce, pSort->iECu
4b00: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
4b10: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  xpr);.  }.  if( 
4b20: 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26  nPrefixReg==0 &&
4b30: 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20   nData>0 ){.    
4b40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
4b50: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
4b60: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
4b70: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
4b80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4b90: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4ba0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
4bb0: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
4bc0: 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f  -nOBSat, regReco
4bd0: 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61  rd);.  if( nOBSa
4be0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
4bf0: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
4c00: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
4c10: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
4c20: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
4c30: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
4c40: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
4c50: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
4c60: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
4c70: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
4c80: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
4c90: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
4ca0: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
4cb0: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
4cc0: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
4cd0: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
4ce0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
4cf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d00: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
4d10: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
4d20: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
4d30: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
4d40: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
4d50: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
4d60: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
4d70: 0a 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20  .    regPrevKey 
4d80: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
4d90: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
4da0: 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  em += pSort->nOB
4db0: 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  Sat;.    nKey = 
4dc0: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
4dd0: 4f 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20  OBSat + bSeq;.  
4de0: 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20    if( bSeq ){.  
4df0: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4e00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e10: 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72  1(v, OP_IfNot, r
4e20: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a  egBase+nExpr); .
4e30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4e40: 20 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c   addrFirst = sql
4e50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
4e60: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73  , OP_SequenceTes
4e70: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
4e80: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56  or);.    }.    V
4e90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4eb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
4ec0: 61 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c  are, regPrevKey,
4ed0: 20 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d   regBase, pSort-
4ee0: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f  >nOBSat);.    pO
4ef0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
4f00: 65 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61  etOp(v, pSort->a
4f10: 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
4f20: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64     if( pParse->d
4f30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f  ) return;.    pO
4f50: 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e  p->p2 = nKey + n
4f60: 44 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20  Data;.    pKI = 
4f70: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
4f80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49  ;.    memset(pKI
4f90: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c  ->aSortOrder, 0,
4fa0: 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 29   pKI->nKeyField)
4fb0: 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a 75  ; /* Makes OP_Ju
4fc0: 6d 70 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a 20  mp testable */. 
4fd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
4fe0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
4ff0: 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45 59  har*)pKI, P4_KEY
5000: 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73 74 63  INFO);.    testc
5010: 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69  ase( pKI->nAllFi
5020: 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46  eld > pKI->nKeyF
5030: 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20 20 70 4f  ield+2 );.    pO
5040: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d  p->p4.pKeyInfo =
5050: 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
5060: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
5070: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f  rt->pOrderBy, nO
5080: 42 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20  BSat,.          
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d   pKI->nAllField-
50c0: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2d 31  pKI->nKeyField-1
50d0: 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d  );.    addrJmp =
50e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
50f0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
5100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5110: 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
5120: 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72  drJmp+1, 0, addr
5130: 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65  Jmp+1); VdbeCove
5140: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f  rage(v);.    pSo
5150: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d  rt->labelBkOut =
5160: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
5170: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53  Label(v);.    pS
5180: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  ort->regReturn =
5190: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
51a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
51b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
51c0: 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  ub, pSort->regRe
51d0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  turn, pSort->lab
51e0: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71  elBkOut);.    sq
51f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5200: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
5210: 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  r, pSort->iECurs
5220: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69  or);.    if( iLi
5230: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
5240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5250: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
5260: 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  it, pSort->label
5270: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 56 64 62  Done);.      Vdb
5280: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5290: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
52a0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
52b0: 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73  ddrFirst);.    s
52c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
52d0: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ve(pParse, regBa
52e0: 73 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  se, regPrevKey, 
52f0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a  pSort->nOBSat);.
5300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5310: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
5320: 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  mp);.  }.  if( p
5330: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
5340: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
5350: 72 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d  rter ){.    op =
5360: 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74   OP_SorterInsert
5370: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
5380: 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  p = OP_IdxInsert
5390: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
53a0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
53b0: 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  op, pSort->iECur
53c0: 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a  sor, regRecord,.
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 20 72 65 67 42 61 73 65 2b 6e         regBase+n
53f0: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
5400: 53 61 74 29 3b 0a 20 20 69 66 28 20 69 4c 69 6d  Sat);.  if( iLim
5410: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
5420: 64 72 3b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d  dr;.    int r1 =
5430: 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20   0;.    /* Fill 
5440: 74 68 65 20 73 6f 72 74 65 72 20 75 6e 74 69 6c  the sorter until
5450: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 4c 49 4d   it contains LIM
5460: 49 54 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65  IT+OFFSET entrie
5470: 73 2e 20 20 28 54 68 65 20 69 4c 69 6d 69 74 0a  s.  (The iLimit.
5480: 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65 72 20      ** register 
5490: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  is initialized w
54a0: 69 74 68 20 76 61 6c 75 65 20 6f 66 20 4c 49 4d  ith value of LIM
54b0: 49 54 2b 4f 46 46 53 45 54 2e 29 20 20 41 66 74  IT+OFFSET.)  Aft
54c0: 65 72 20 74 68 65 20 73 6f 72 74 65 72 0a 20 20  er the sorter.  
54d0: 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70 2c 20 64    ** fills up, d
54e0: 65 6c 65 74 65 20 74 68 65 20 6c 65 61 73 74 20  elete the least 
54f0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73 6f 72  entry in the sor
5500: 74 65 72 20 61 66 74 65 72 20 65 61 63 68 20 69  ter after each i
5510: 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a 20 54 68  nsert..    ** Th
5520: 75 73 20 77 65 20 6e 65 76 65 72 20 68 6f 6c 64  us we never hold
5530: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 4c   more than the L
5540: 49 4d 49 54 2b 4f 46 46 53 45 54 20 72 6f 77 73  IMIT+OFFSET rows
5550: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74 20 6f 6e   in memory at on
5560: 63 65 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  ce */.    addr =
5570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5580: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65  p1(v, OP_IfNotZe
5590: 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  ro, iLimit); Vdb
55a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
55b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
55c0: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
55d0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
55e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
55f0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
5600: 6f 70 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  op ){.      r1 =
5610: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
5620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5630: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5640: 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d 3e 69 45  olumn, pSort->iE
5650: 43 75 72 73 6f 72 2c 20 6e 45 78 70 72 2c 20 72  Cursor, nExpr, r
5660: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
5670: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 71 22 29  mment((v, "seq")
5680: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
56a0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f  , OP_Delete, pSo
56b0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
56c0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f     if( pSort->bO
56d0: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
56e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
56f0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69 73  he inner loop is
5700: 20 64 72 69 76 65 6e 20 62 79 20 61 6e 20 69 6e   driven by an in
5710: 64 65 78 20 73 75 63 68 20 74 68 61 74 20 76 61  dex such that va
5720: 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  lues from.      
5730: 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 74 65 72  ** the same iter
5740: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 6e  ation of the inn
5750: 65 72 20 6c 6f 6f 70 20 61 72 65 20 69 6e 20 73  er loop are in s
5760: 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 74 68 65  orted order, the
5770: 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  n.      ** immed
5780: 69 61 74 65 6c 79 20 6a 75 6d 70 20 74 6f 20 74  iately jump to t
5790: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
57a0: 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72 20 6c 6f  n of an inner lo
57b0: 6f 70 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  op if the.      
57c0: 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  ** entry from th
57d0: 65 20 63 75 72 72 65 6e 74 20 69 74 65 72 61 74  e current iterat
57e0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  ion does not fit
57f0: 20 69 6e 74 6f 20 74 68 65 20 74 6f 70 0a 20 20   into the top.  
5800: 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46      ** LIMIT+OFF
5810: 53 45 54 20 65 6e 74 72 69 65 73 20 6f 66 20 74  SET entries of t
5820: 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20  he sorter. */.  
5830: 20 20 20 20 69 6e 74 20 69 42 72 6b 20 3d 20 73      int iBrk = s
5840: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5850: 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20  tAddr(v) + 2;.  
5860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5870: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
5880: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2c 20 69  regBase+nExpr, i
5890: 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
58a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
58b0: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
58c0: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
58d0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
58e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
58f0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5900: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
5910: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
5920: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
5930: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
5940: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
5950: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
5960: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
5970: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
5980: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
5990: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
59a0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
59b0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
59c0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
59d0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
59e0: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
59f0: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
5a00: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
5a10: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
5a20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5a30: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
5a40: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
5a50: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5a60: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
5a70: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
5a80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5a90: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
5aa0: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
5ab0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
5ac0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
5ad0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
5ae0: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
5af0: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
5b00: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
5b10: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
5b20: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
5b30: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
5b40: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
5b50: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
5b60: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
5b70: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
5b80: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
5b90: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
5ba0: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
5bb0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
5bc0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
5bd0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
5be0: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
5bf0: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
5c00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5c10: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
5c20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5c30: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5c40: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5c50: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5c60: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
5c70: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
5c80: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
5c90: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
5ca0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
5cb0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
5cc0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
5cd0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
5ce0: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
5cf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5d00: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
5d10: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
5d20: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
5d30: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
5d40: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
5d50: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
5d60: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
5d70: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5d80: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
5d90: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
5da0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
5db0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
5dc0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
5dd0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
5de0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5df0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
5e00: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
5e10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5e20: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
5e30: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
5e40: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
5e50: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5e60: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
5e70: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
5e80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5e90: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
5ea0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5eb0: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
5ec0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73  code for the ins
5ed0: 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ide of the inner
5ee0: 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45   loop.** of a SE
5ef0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  LECT..**.** If s
5f00: 72 63 54 61 62 20 69 73 20 6e 65 67 61 74 69 76  rcTab is negativ
5f10: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e 70  e, then the p->p
5f20: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
5f30: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
5f40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
5f50: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
5f60: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5f70: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5f80: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5f90: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5fa0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d 3e  m srcTab and p->
5fb0: 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f  pEList is used o
5fc0: 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74  nly .** to get t
5fd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
5fe0: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c  umns and the col
5ff0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
6000: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e  for each column.
6010: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6020: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
6030: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6040: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
6050: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
6060: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6080: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   The complete se
6090: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62  lect statement b
60a0: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
60b0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
60c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
60d0: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
60e0: 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67 61  able if non-nega
60f0: 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  tive */.  SortCt
6100: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
6110: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
6120: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
6130: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
6140: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
6150: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
6160: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
6170: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
6180: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
6190: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
61a0: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
61b0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
61c0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
61d0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
61e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
61f0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
6200: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
6210: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6230: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
6240: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
6250: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
6260: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6270: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
6280: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
6290: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
62a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
62b0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
62c0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
62d0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
62e0: 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a  est->eDest;   /*
62f0: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
6300: 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  of results */.  
6310: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
6320: 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46  t->iSDParm; /* F
6330: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
6340: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
6350: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
6360: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
6370: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
6380: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
6390: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
63a0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
63b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
63c0: 61 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  a registers befo
63d0: 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a  re regResult */.
63e0: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
63f0: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
6400: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
6410: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
6420: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
6430: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
6440: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
6450: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
6460: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
6470: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
6480: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
6490: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
64a0: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
64b0: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
64c0: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
64d0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
64e0: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
64f0: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
6500: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
6510: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
6520: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
6530: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
6540: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
6550: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
6560: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
6570: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
6580: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
6590: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
65a0: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
65b0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
65c0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
65d0: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
65e0: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
65f0: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
6600: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
6610: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
6620: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
6630: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6640: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
6650: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
6660: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
6670: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
6680: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
6690: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
66a0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
66b0: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
66c0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
66d0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
66e0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
66f0: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
6700: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
6710: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
6720: 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  ultCol = p->pELi
6730: 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66  st->nExpr;..  if
6740: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
6750: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 6f  0 ){.    if( pSo
6760: 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72 65  rt ){.      nPre
6770: 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e  fixReg = pSort->
6780: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
6790: 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53 6f  .      if( !(pSo
67a0: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
67b0: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
67c0: 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65 67  er) ) nPrefixReg
67d0: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
67e0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69  ->nMem += nPrefi
67f0: 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xReg;.    }.    
6800: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
6810: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
6820: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
6830: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
6840: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
6850: 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74 43  ->iSdst+nResultC
6860: 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ol > pParse->nMe
6870: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  m ){.    /* This
6880: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e   is an error con
6890: 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  dition that can 
68a0: 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d  result, for exam
68b0: 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c 45  ple, when a SELE
68c0: 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  CT.    ** on the
68d0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
68e0: 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63 6f   of an INSERT co
68f0: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73 75  ntains more resu
6900: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a  lt columns than.
6910: 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72 65      ** there are
6920: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
6930: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  table on the lef
6940: 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77 69  t.  The error wi
6950: 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20 20  ll be caught.   
6960: 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65 64   ** and reported
6970: 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65 20   later.  But we 
6980: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
6990: 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
69a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  is allocated.   
69b0: 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74 68   ** to avoid oth
69c0: 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72 6f  er spurious erro
69d0: 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74 69  rs in the meanti
69e0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72 73  me. */.    pPars
69f0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
6a00: 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65  ltCol;.  }.  pDe
6a10: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73  st->nSdst = nRes
6a20: 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 4f 72 69  ultCol;.  regOri
6a30: 67 20 3d 20 72 65 67 52 65 73 75 6c 74 20 3d 20  g = regResult = 
6a40: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
6a50: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
6a60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6a70: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6a80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6a90: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6aa0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
6ab0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
6ac0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
6ad0: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 2d 3e  nt((v, "%s", p->
6ae0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
6af0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6b00: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
6b10: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
6b20: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6b30: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6b40: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6b50: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6b60: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6b70: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6b80: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6b90: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
6ba0: 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a    u8 ecelFlags;.
6bb0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6bc0: 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d  RT_Mem || eDest=
6bd0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
6be0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6bf0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65  ine ){.      ece
6c00: 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  lFlags = SQLITE_
6c10: 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65  ECEL_DUP;.    }e
6c20: 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  lse{.      ecelF
6c30: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lags = 0;.    }.
6c40: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
6c50: 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20   hasDistinct==0 
6c60: 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45 70  && eDest!=SRT_Ep
6c70: 68 65 6d 54 61 62 20 26 26 20 65 44 65 73 74 21  hemTab && eDest!
6c80: 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20  =SRT_Table ){.  
6c90: 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20      /* For each 
6ca0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d  expression in p-
6cb0: 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20  >pEList that is 
6cc0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
6cd0: 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20  ression in.     
6ce0: 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
6cf0: 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e   clause (pSort->
6d00: 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74  pOrderBy), set t
6d10: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  he associated . 
6d20: 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79       ** iOrderBy
6d30: 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65  Col value to one
6d40: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69   more than the i
6d50: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45  ndex of the ORDE
6d60: 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65  R BY .      ** e
6d70: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
6d80: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68   the sort-key th
6d90: 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  at pushOntoSorte
6da0: 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  r() will generat
6db0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  e..      ** This
6dc0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70   allows the p->p
6dd0: 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62  EList field to b
6de0: 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  e omitted from t
6df0: 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64  he sorted record
6e00: 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e  ,.      ** savin
6e10: 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55 20  g space and CPU 
6e20: 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20  cycles.  */.    
6e30: 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28    ecelFlags |= (
6e40: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
6e50: 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  REF|SQLITE_ECEL_
6e60: 52 45 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  REF);.      for(
6e70: 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  i=pSort->nOBSat;
6e80: 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   i<pSort->pOrder
6e90: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
6ea0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
6eb0: 20 20 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d          if( (j =
6ec0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
6ed0: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
6ee0: 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20  rByCol)>0 ){.   
6ef0: 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74         p->pEList
6f00: 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72  ->a[j-1].u.x.iOr
6f10: 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70  derByCol = i+1-p
6f20: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
6f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6f40: 20 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20        regOrig = 
6f50: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
6f60: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
6f70: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  || eDest==SRT_Me
6f80: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  m .           ||
6f90: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6fa0: 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d  utine || eDest==
6fb0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
6fc0: 20 20 7d 0a 20 20 20 20 6e 52 65 73 75 6c 74 43    }.    nResultC
6fd0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ol = sqlite3Expr
6fe0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
6ff0: 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74 2c 72 65  rse,p->pEList,re
7000: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a    0,ecelFlags);.
7040: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
7050: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
7060: 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e  d was present on
7070: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7080: 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74  ement.  ** and t
7090: 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e  his row has been
70a0: 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68   seen before, th
70b0: 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74  en do not make t
70c0: 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72  his row.  ** par
70d0: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  t of the result.
70e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44  .  */.  if( hasD
70f0: 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
7100: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
7110: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
7120: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
7130: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
7140: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
7150: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
7160: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
7170: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
7180: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
7190: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
71a0: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
71b0: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
71c0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
71d0: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
71e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
71f0: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
7200: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
7210: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
7220: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
7230: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
7240: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
7250: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
7260: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
7270: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
7280: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
7290: 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
72a0: 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69  eral coded earli
72b0: 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c  er to an OP_Null
72c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73  .        ** sets
72d0: 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64   the MEM_Cleared
72e0: 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73   bit on the firs
72f0: 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68  t register of th
7300: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
7310: 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68  vious value.  Th
7320: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
7330: 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f  e OP_Ne below to
7340: 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20   always.        
7350: 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66  ** fail on the f
7360: 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
7370: 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20  f the loop even 
7380: 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  if the first.   
7390: 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61       ** row is a
73a0: 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20  ll NULLs..      
73b0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
73c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
73d0: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
73e0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
73f0: 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
7400: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
7410: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
7420: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
7430: 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  p->opcode = OP_N
7440: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ull;.        pOp
7450: 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->p1 = 1;.      
7460: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50    pOp->p2 = regP
7470: 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a  rev;..        iJ
7480: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
7490: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
74a0: 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  + nResultCol;.  
74b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
74c0: 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b  <nResultCol; i++
74d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c  ){.          Col
74e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
74f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
7500: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
7510: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
7520: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
7530: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
7540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
7550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7560: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
7570: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
7580: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
7590: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
75a0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
75b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
75c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
75d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp3(v, OP_Eq, r
75e0: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e  egResult+i, iCon
75f0: 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69  tinue, regPrev+i
7600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7610: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7620: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7640: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
7650: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
7660: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
7670: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
7680: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7690: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
76a0: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
76b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
76c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
76d0: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
76e0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
76f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7700: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7710: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
7720: 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  opy, regResult, 
7730: 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74  regPrev, nResult
7740: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
7750: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
7760: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
7770: 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
7780: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
7790: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
77a0: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
77b0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
77c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
77d0: 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
77e0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73  lt: {.        as
77f0: 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d  sert( pDistinct-
7800: 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  >eTnctType==WHER
7810: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
7820: 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  ERED );.        
7830: 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
7840: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  rse, pDistinct->
7850: 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e  tabTnct, iContin
7860: 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ue, nResultCol,.
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b       regResult);
7890: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
78b0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29    if( pSort==0 )
78c0: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
78d0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
78e0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
78f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
7900: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
7910: 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c  /* In this mode,
7920: 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72   write each quer
7930: 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20  y result to the 
7940: 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  key of the tempo
7950: 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rary.    ** tabl
7960: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
7970: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7980: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7990: 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54  ECT.    case SRT
79a0: 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20  _Union: {.      
79b0: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31  int r1;.      r1
79c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
79d0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
79e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
79f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
7a00: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
7a10: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
7a20: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
7a30: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7a40: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7a50: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
7a60: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7a70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7a80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
7a90: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
7aa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7ab0: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
7ac0: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
7ad0: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
7ae0: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
7af0: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
7b00: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
7b10: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
7b20: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
7b30: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
7b40: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
7b50: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
7b60: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
7b70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7b80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b90: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
7ba0: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  m, regResult, nR
7bb0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7bc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7bd0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7be0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7bf0: 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ECT */..    /* S
7c00: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
7c10: 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
7c20: 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
7c30: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7c40: 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53  Fifo:.    case S
7c50: 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20  RT_DistFifo:.   
7c60: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
7c70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
7c80: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
7c90: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
7ca0: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
7cb0: 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b  rse, nPrefixReg+
7cc0: 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
7cd0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
7ce0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
7cf0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
7d00: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
7d10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7d20: 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29  Dest==SRT_Fifo )
7d30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7d40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7d50: 74 46 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73  tFifo );.      s
7d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7d70: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7d80: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7d90: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72  esultCol, r1+nPr
7da0: 65 66 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65  efixReg);.#ifnde
7db0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7dc0: 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  E.      if( eDes
7dd0: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7de0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
7df0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
7e00: 20 69 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68   is DistFifo, th
7e10: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
7e20: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
7e30: 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68      ** on an eph
7e40: 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66  emeral index. If
7e50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
7e60: 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
7e70: 65 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ent.        ** i
7e80: 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20  n the index, do 
7e90: 6e 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20  not write it to 
7ea0: 74 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e  the output. If n
7eb0: 6f 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20  ot, add the.    
7ec0: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72      ** current r
7ed0: 6f 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ow to the index 
7ee0: 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68  and proceed with
7ef0: 20 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74   writing it to t
7f00: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
7f10: 74 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65  tput table as we
7f20: 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
7f30: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
7f40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7f50: 72 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20  r(v) + 4;.      
7f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7f70: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
7f80: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64  nd, iParm+1, add
7f90: 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  r, r1, 0);.     
7fa0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
7fb0: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
7fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7fd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
7fe0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65  , iParm+1, r1,re
7ff0: 67 52 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43  gResult,nResultC
8000: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ol);.        ass
8010: 65 72 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b  ert( pSort==0 );
8020: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
8030: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8040: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
8050: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
8060: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
8070: 50 72 65 66 69 78 52 65 67 2c 72 65 67 52 65 73  PrefixReg,regRes
8080: 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78 52 65 67  ult,1,nPrefixReg
8090: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
80a0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
80b0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
80c0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
80d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
80f0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
8100: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8110: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8120: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
8130: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
8140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
8150: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
8160: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
8170: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8180: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8190: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
81a0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
81b0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
81c0: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
81d0: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
81e0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
81f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
8200: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
8210: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
8220: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
8230: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
8240: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
8250: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
8260: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
8270: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
8280: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
8290: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
82a0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
82b0: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
82c0: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
82d0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
82e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
82f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
8300: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
8310: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
8320: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
8330: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
8340: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
8350: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
8360: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
8370: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
8380: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
8390: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
83a0: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
83b0: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
83c0: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
83d0: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
83e0: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
83f0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
8400: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
8410: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
8420: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
8430: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
8440: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
8450: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8460: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
8470: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
8480: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
8490: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
84a0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74  e3Strlen30(pDest
84b0: 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52 65  ->zAffSdst)==nRe
84c0: 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20  sultCol );.     
84d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84e0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
84f0: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
8500: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20  , nResultCol, . 
8510: 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 70             r1, p
8520: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
8530: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8540: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8550: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
8560: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
8570: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
8580: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
8590: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
85a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
85b0: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67  , iParm, r1, reg
85c0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
85d0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
85e0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
85f0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
8600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
8610: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
8620: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
8630: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
8640: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
8650: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
8660: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
8670: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
8680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8690: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
86a0: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
86b0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
86c0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
86d0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
86e0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
86f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8700: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
8710: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
8720: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
8730: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
8740: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
8750: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
8760: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
8770: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
8780: 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20   or array of .  
8790: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c    ** memory cell
87a0: 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20  s and break out 
87b0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
87c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
87d0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
87e0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
87f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8800: 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73  nResultCol<=pDes
8810: 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20  t->nSdst );.    
8820: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
8830: 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  er(.            
8840: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
8850: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67  , regResult, reg
8860: 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  Orig, nResultCol
8870: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
8880: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8890: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
88a0: 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e  ultCol==pDest->n
88b0: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
88c0: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
88d0: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
88e0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
88f0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
8900: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
8910: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8920: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8930: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
8940: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
8950: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
8960: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
8970: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
8980: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
8990: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
89a0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
89b0: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
89c0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
89d0: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
89e0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
89f0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
8a00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8a10: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
8a20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
8a30: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
8a40: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
8a50: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
8a60: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
8a70: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a  ig, nResultCol,.
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65         nPrefixRe
8aa0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
8ab0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
8ac0: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
8ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ae0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
8af0: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
8b00: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
8b10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8b30: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
8b40: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
8b50: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
8b60: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
8b70: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
8b80: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
8b90: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8ba0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8bb0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
8bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
8bd0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
8be0: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
8bf0: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
8c00: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
8c10: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
8c20: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
8c30: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
8c40: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
8c50: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
8c60: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
8c70: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
8c80: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
8c90: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
8ca0: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
8cb0: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
8cc0: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
8cd0: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
8ce0: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
8cf0: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
8d00: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
8d10: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
8d20: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
8d30: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
8d40: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
8d50: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
8d60: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
8d70: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
8d80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
8d90: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
8da0: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
8db0: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
8dc0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8dd0: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
8de0: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
8df0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8e00: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
8e10: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
8e20: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
8e30: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8e40: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
8e50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
8e60: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
8e70: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
8e80: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
8e90: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8ea0: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8eb0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
8ec0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
8ed0: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
8ee0: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
8ef0: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
8f00: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
8f10: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
8f20: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
8f30: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
8f40: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
8f50: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
8f60: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
8f70: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
8f80: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8f90: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
8fa0: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 0, .       
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8fe0: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8ff0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
9000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9020: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
9030: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
9040: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
9050: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
9060: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
9070: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9080: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9090: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
90a0: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
90b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
90c0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
90d0: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
90e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
90f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
9100: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
9110: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9120: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
9150: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
9160: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
9170: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9180: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
9190: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
91a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
91b0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
91c0: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
91d0: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
91e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
91f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
9200: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
9210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9220: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
9230: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
9240: 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  , r1, r2, nKey+2
9250: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  );.      if( add
9260: 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56  rTest ) sqlite3V
9270: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
9280: 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20  ddrTest);.      
9290: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
92a0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
92b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
92c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
92d0: 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65  (pParse, r2, nKe
92e0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  y+2);.      brea
92f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
9300: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
9310: 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  TE */....#if !de
9320: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9330: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
9340: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
9350: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
9360: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
9370: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
9380: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
9390: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
93a0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
93b0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
93c0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
93d0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
93e0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
93f0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
9400: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
9410: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
9420: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
9430: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
9440: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
9450: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
9460: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
9470: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
9480: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
9490: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
94a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
94b0: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
94c0: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
94d0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
94e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
94f0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
9500: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
9510: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
9520: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
9530: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
9540: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
9550: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
9560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9570: 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
9580: 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
9590: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
95a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
95b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
95c0: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
95d0: 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f  ct sufficient fo
95e0: 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20  r an index of N 
95f0: 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a  key columns and.
9600: 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d  ** X extra colum
9610: 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ns..*/.KeyInfo *
9620: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9630: 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  loc(sqlite3 *db,
9640: 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a   int N, int X){.
9650: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28    int nExtra = (
9660: 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  N+X)*(sizeof(Col
9670: 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a 65  lSeq*)+1) - size
9680: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20  of(CollSeq*);.  
9690: 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c  KeyInfo *p = sql
96a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
96b0: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65 79  N(db, sizeof(Key
96c0: 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29 3b  Info) + nExtra);
96d0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
96e0: 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
96f0: 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e  (u8*)&p->aColl[N
9700: 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79  +X];.    p->nKey
9710: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a  Field = (u16)N;.
9720: 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64      p->nAllField
9730: 20 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a 20   = (u16)(N+X);. 
9740: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
9750: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
9760: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
9770: 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
9780: 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72  (&p[1], 0, nExtr
9790: 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
97a0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
97b0: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (db);.  }.  retu
97c0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
97d0: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
97e0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
97f0: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
9800: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
9810: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
9820: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
9830: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
9840: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
9850: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
9860: 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64  te3DbFreeNN(p->d
9870: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
9880: 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70  .** Make a new p
9890: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
98a0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65  nfo object.*/.Ke
98b0: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
98c0: 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f  yInfoRef(KeyInfo
98d0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
98e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
98f0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
9900: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nRef++;.  }.  r
9910: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64  eturn p;.}..#ifd
9920: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9930: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
9940: 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f  E if a KeyInfo o
9950: 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61  bject can be cha
9960: 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66  nge.  The KeyInf
9970: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20  o object.** can 
9980: 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20  only be changed 
9990: 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20  if this is just 
99a0: 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e  a single referen
99b0: 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74  ce to the object
99c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
99d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
99e0: 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  y inside of asse
99f0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
9a00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b  .*/.int sqlite3K
9a10: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
9a20: 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72  e(KeyInfo *p){ r
9a30: 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31  eturn p->nRef==1
9a40: 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ; }.#endif /* SQ
9a50: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
9a60: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
9a70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
9a80: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
9a90: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
9aa0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
9ab0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
9ac0: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
9ad0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
9ae0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9af0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
9b00: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
9b10: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
9b20: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
9b30: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
9b40: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
9b50: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
9b60: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
9b70: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
9b80: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
9b90: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
9ba0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
9bb0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9bc0: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
9bd0: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
9be0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
9bf0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
9c00: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
9c10: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
9c20: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
9c30: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
9c40: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
9c50: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
9c60: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64  ture is obtained
9c70: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
9c80: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
9c90: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
9ca0: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
9cb0: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
9cc0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
9cd0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
9ce0: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
9cf0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
9d00: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
9d10: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
9d20: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9d30: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9d40: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
9d50: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
9d60: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
9d70: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
9d80: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
9d90: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
9da0: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
9db0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
9dc0: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
9dd0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
9de0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
9df0: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20  the end */.){.  
9e00: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79  int nExpr;.  Key
9e10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73  Info *pInfo;.  s
9e20: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9e30: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
9e40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9e50: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
9e60: 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  ..  nExpr = pLis
9e70: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66  t->nExpr;.  pInf
9e80: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9e90: 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
9ea0: 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61  r-iStart, nExtra
9eb0: 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  +1);.  if( pInfo
9ec0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9ed0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
9ee0: 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29  Writeable(pInfo)
9ef0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53   );.    for(i=iS
9f00: 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73  tart, pItem=pLis
9f10: 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e  t->a+iStart; i<n
9f20: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
9f30: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  ++){.      pInfo
9f40: 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74  ->aColl[i-iStart
9f50: 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  ] = sqlite3ExprN
9f60: 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  NCollSeq(pParse,
9f70: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
9f80: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
9f90: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
9fa0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
9fb0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
9fc0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
9fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  }../*.** Name of
9fe0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9ff0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
a000: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
a010: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
a020: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
a030: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
a040: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
a050: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
a060: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
a070: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
a080: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
a090: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
a0a0: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
a0b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
a0c0: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
a0d0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
a0e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a0f0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
a100: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
a110: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a120: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
a130: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a140: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
a150: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
a160: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
a170: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
a180: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
a190: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
a1a0: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
a1b0: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
a1c0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
a1d0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
a1e0: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
a1f0: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
a200: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
a210: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
a220: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
a230: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
a240: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
a250: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
a260: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
a270: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
a280: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
a290: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
a2a0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a2b0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
a2c0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
a2d0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
a2e0: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
a2f0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
a300: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
a310: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a320: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
a330: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
a340: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
a350: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
a360: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
a370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a380: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
a390: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
a3a0: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
a3b0: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
a3c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a3d0: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
a3e0: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
a3f0: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
a400: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
a410: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
a420: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
a430: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
a440: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
a450: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
a460: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
a470: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
a480: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
a490: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
a4a0: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
a4b0: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
a4c0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
a4d0: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
a4e0: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
a4f0: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
a500: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
a510: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
a520: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
a530: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
a540: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
a550: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
a560: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
a570: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
a580: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
a590: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
a5a0: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
a5b0: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a5c0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
a5d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a5e0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
a5f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a600: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
a610: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
a620: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
a630: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
a640: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
a650: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
a660: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
a670: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
a680: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
a690: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
a6a0: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
a6b0: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
a6c0: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
a6d0: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
a6e0: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
a6f0: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
a700: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
a710: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
a720: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
a730: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
a740: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
a750: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
a760: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
a770: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
a780: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
a790: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
a7a0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
a7b0: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
a7c0: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
a7d0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
a7e0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
a7f0: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
a800: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
a810: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
a820: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
a830: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
a840: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
a850: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
a860: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
a870: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
a880: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
a890: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
a8a0: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
a8b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a8c0: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
a8d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a8e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a8f0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
a900: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
a910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
a930: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
a940: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
a950: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
a980: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
a990: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
a9a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
a9b0: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
a9c0: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9e0: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
a9f0: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
aa00: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
aa10: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
aa20: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
aa30: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
aa40: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
aa50: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
aa60: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
aa70: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
aa80: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
aa90: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
aaa0: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
aab0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
aac0: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
aad0: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
aae0: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
aaf0: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
ab00: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
ab10: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
ab20: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
ab30: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
ab40: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ab50: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
ab60: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
ab70: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
ab80: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
ab90: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
aba0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
abb0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
abc0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
abd0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
abe0: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
abf0: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
ac00: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
ac10: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
ac20: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
ac30: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
ac40: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
ac50: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
ac60: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
ac70: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
ac80: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
ac90: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
aca0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
acb0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
acc0: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
acd0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
ace0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
acf0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
ad00: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
ad10: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
ad20: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
ad30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
ad40: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ad50: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
ad60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
ad70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ad80: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
ad90: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
ada0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
adb0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
adc0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
add0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ade0: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
adf0: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
ae00: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
ae10: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
ae20: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
ae30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ae40: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae60: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
ae70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
ae80: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
ae90: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
aea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
aeb0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
aec0: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
aed0: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
aee0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
aef0: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
af00: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
af10: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
af20: 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65  ;.  int addrOnce
af30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62   = 0;.  int iTab
af40: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
af50: 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e  rderBy = pSort->
af60: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
af70: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
af80: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
af90: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
afa0: 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  rm;.  int regRow
afb0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
afc0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20  ;.  int iCol;.  
afd0: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  int nKey;.  int 
afe0: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b000: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
b010: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
b020: 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20  nt nSortData;   
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b040: 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65  * Trailing value
b050: 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73  s to read from s
b060: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  orter */.  int i
b070: 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20  ;.  int bSeq;   
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
b0a0: 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63  orter record inc
b0b0: 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a  ludes seq. no. *
b0c0: 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
b0d0: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
b0e0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
b0f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ..  assert( addr
b100: 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28  Break<0 );.  if(
b110: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
b120: 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ut ){.    sqlite
b130: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b140: 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e  P_Gosub, pSort->
b150: 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74  regReturn, pSort
b160: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20  ->labelBkOut);. 
b170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
b180: 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  to(v, addrBreak)
b190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b1a0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b1b0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
b1c0: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
b1d0: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
b1e0: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
b1f0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
b200: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
b210: 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ne || eDest==SRT
b220: 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52  _Mem ){.    regR
b230: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  owid = 0;.    re
b240: 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53  gRow = pDest->iS
b250: 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  dst;.    nSortDa
b260: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
b270: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f  }else{.    regRo
b280: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
b290: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b2a0: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71  .    regRow = sq
b2b0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
b2c0: 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d  e(pParse, nColum
b2d0: 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  n);.    nSortDat
b2e0: 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  a = nColumn;.  }
b2f0: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
b300: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
b310: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
b320: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
b330: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
b340: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
b350: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
b360: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
b370: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
b380: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
b390: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
b3a0: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
b3b0: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
b3c0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
b3d0: 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
b3e0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b3f0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
b400: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
b410: 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54  enPseudo, iSortT
b420: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
b430: 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61  nKey+1+nSortData
b440: 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f  );.    if( addrO
b450: 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62  nce ) sqlite3Vdb
b460: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b470: 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72  rOnce);.    addr
b480: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
b490: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b4a0: 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c  orterSort, iTab,
b4b0: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
b4c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b4d0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
b4e0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
b4f0: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
b500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b510: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
b520: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
b530: 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61  SortOut, iSortTa
b540: 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30  b);.    bSeq = 0
b550: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
b560: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b570: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b580: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
b590: 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
b5a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63  verage(v);.    c
b5b0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
b5c0: 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  iOffset, addrCon
b5d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72  tinue);.    iSor
b5e0: 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20  tTab = iTab;.   
b5f0: 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20   bSeq = 1;.  }. 
b600: 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e   for(i=0, iCol=n
b610: 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69 3c 6e 53  Key+bSeq-1; i<nS
b620: 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20  ortData; i++){. 
b630: 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d     if( aOutEx[i]
b640: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
b650: 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20  ==0 ) iCol++;.  
b660: 7d 0a 20 20 66 6f 72 28 69 3d 6e 53 6f 72 74 44  }.  for(i=nSortD
b670: 61 74 61 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ata-1; i>=0; i--
b680: 29 7b 0a 20 20 20 20 69 6e 74 20 69 52 65 61 64  ){.    int iRead
b690: 3b 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78  ;.    if( aOutEx
b6a0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
b6b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 52 65  Col ){.      iRe
b6c0: 61 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75  ad = aOutEx[i].u
b6d0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
b6e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b6f0: 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d     iRead = iCol-
b700: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
b710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b720: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
b730: 72 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65  rtTab, iRead, re
b740: 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62  gRow+i);.    Vdb
b750: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
b760: 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61  ", aOutEx[i].zNa
b770: 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me ? aOutEx[i].z
b780: 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d  Name : aOutEx[i]
b790: 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20  .zSpan));.  }.  
b7a0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
b7b0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
b7c0: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
b7d0: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
b7e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b7f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
b800: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67  owid, iParm, reg
b810: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
b820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b830: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
b840: 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67  arm, regRow, reg
b850: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
b860: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
b870: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
b880: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
b890: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b8a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b8b0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
b8c0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
b8d0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
b8e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b8f0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29  pDest->zAffSdst)
b900: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
b910: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
b920: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b930: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  gRow, nColumn, r
b940: 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20  egRowid,.       
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
b970: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
b990: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
b9a0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
b9b0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b9c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b9d0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
b9e0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
b9f0: 67 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20  gRowid, regRow, 
ba00: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
ba10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ba20: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
ba30: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
ba40: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
ba50: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
ba60: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
ba70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba80: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
ba90: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
baa0: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
bab0: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
bac0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
bad0: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
bae0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
baf0: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
bb00: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
bb10: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
bb20: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
bb30: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
bb40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bb50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
bb60: 73 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e  sultRow, pDest->
bb70: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
bb80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bb90: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
bba0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
bbb0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
bbc0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65  olumn);.      }e
bbd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
bbe0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bbf0: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
bc00: 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
bc10: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
bc20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
bc30: 28 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20  ( regRowid ){.  
bc40: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
bc50: 5f 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71  _Set ){.      sq
bc60: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
bc70: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
bc80: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
bc90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bca0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
bcb0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
bcc0: 65 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20  egRow);.    }.  
bcd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
bce0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
bcf0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  regRowid);.  }. 
bd00: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
bd10: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
bd20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bd30: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
bd40: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
bd50: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
bd60: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
bd70: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
bd80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
bd90: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
bda0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
bdb0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bdc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
bdd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bde0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
bdf0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
be00: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
be10: 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  if( pSort->regRe
be20: 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64  turn ) sqlite3Vd
be30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
be40: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65  eturn, pSort->re
be50: 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
be60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
be70: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
be80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
be90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
bea0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
beb0: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
bec0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
bed0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
bee0: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
bef0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
bf00: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
bf10: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
bf20: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
bf30: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
bf40: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
bf50: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
bf60: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
bf70: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
bf80: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
bf90: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
bfa0: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
bfb0: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
bfc0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
bfd0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
bfe0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
bff0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
c000: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
c010: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
c020: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
c030: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
c040: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
c050: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
c060: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
c070: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
c080: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
c090: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
c0a0: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
c0b0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
c0c0: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
c0d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
c0e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
c0f0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
c100: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
c110: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
c120: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
c130: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
c140: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
c150: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
c160: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
c170: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
c180: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
c190: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
c1a0: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
c1b0: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
c1c0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
c1d0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
c1e0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
c1f0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
c200: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
c210: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
c220: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
c230: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
c240: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
c250: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c260: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
c270: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
c280: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
c290: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c2a0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
c2b0: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
c2c0: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29  nType(A,B,C,D,E)
c2d0: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
c2e0: 41 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65  A,B,C,D,E).#else
c2f0: 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28   /* if !defined(
c300: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c310: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a  LUMN_METADATA) *
c320: 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  /.# define colum
c330: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29  nType(A,B,C,D,E)
c340: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
c350: 41 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  A,B).#endif.stat
c360: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
c370: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
c380: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
c390: 43 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  C, .#ifndef SQLI
c3a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c3b0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 45 78 70 72  _METADATA.  Expr
c3c0: 20 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20   *pExpr.#else.  
c3d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
c3e0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
c3f0: 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  igDb,.  const ch
c400: 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a  ar **pzOrigTab,.
c410: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c420: 7a 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a  zOrigCol.#endif.
c430: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
c440: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
c450: 74 20 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t j;.#ifdef SQLI
c460: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c470: 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72  _METADATA.  char
c480: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20   const *zOrigDb 
c490: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
c4a0: 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  t *zOrigTab = 0;
c4b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
c4c0: 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e  OrigCol = 0;.#en
c4d0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
c4e0: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  Expr!=0 );.  ass
c4f0: 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
c500: 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
c510: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
c520: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20  _AGG_COLUMN );  
c530: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
c540: 72 75 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67  runes before agg
c550: 72 65 67 61 74 65 73 0a 20 20 20 20 20 20 20 20  regates.        
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
c580: 2a 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  * are processed 
c590: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  */.  switch( pEx
c5a0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
c5b0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c5c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c5d0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c5e0: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
c5f0: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
c600: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
c610: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
c620: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
c630: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
c640: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
c650: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
c660: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
c670: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
c680: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c690: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
c6a0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
c6b0: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
c6c0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c6d0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
c6e0: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
c6f0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
c700: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
c710: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c720: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
c730: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
c740: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
c750: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
c760: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
c770: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
c780: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
c790: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
c7a0: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
c7b0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
c7c0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
c7d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
c7e0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
c7f0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
c800: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
c810: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
c820: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
c830: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
c840: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
c850: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
c860: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
c870: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
c880: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
c890: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c8a0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
c8b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
c8c0: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
c8d0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
c8e0: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
c8f0: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
c900: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
c910: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
c920: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
c930: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
c940: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
c950: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
c960: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
c970: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
c980: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
c990: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
c9a0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
c9b0: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
c9c0: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
c9d0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
c9e0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
c9f0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
ca00: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
ca10: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
ca20: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
ca30: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
ca40: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
ca50: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
ca60: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
ca70: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
ca80: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
ca90: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
caa0: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
cab0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
cac0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
cad0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
cae0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
caf0: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
cb00: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
cb10: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
cb20: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
cb30: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
cb40: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
cb50: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
cb60: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
cb70: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
cb80: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
cb90: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
cba0: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
cbb0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
cbc0: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
cbd0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
cbe0: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
cbf0: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
cc00: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
cc10: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
cc20: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
cc30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cc40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
cc50: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
cc60: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
cc70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
cc80: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
cc90: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
cca0: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
ccb0: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
ccc0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
ccd0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
cce0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ccf0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
cd00: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
cd10: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
cd20: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
cd30: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
cd40: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
cd50: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
cd60: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
cd70: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
cd80: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cd90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cda0: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
cdb0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
cdc0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
cdd0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
cde0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
cdf0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
ce00: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
ce10: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
ce20: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
ce30: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
ce40: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
ce50: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
ce60: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
ce70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
ce80: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
ce90: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
cea0: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
ceb0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
cec0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
ced0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
cee0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
cef0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
cf00: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
cf10: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
cf20: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
cf30: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
cf40: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
cf50: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
cf60: 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  gCol); .        
cf70: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
cf80: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
cf90: 20 74 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20   table or a CTE 
cfa0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
cfb0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
cfc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
cfd0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
cfe0: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
cff0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
d000: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
d010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
d020: 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  ol==XN_ROWID || 
d030: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
d040: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
d050: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
d060: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
d070: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
d080: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
d090: 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  igCol = "rowid";
d0a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d0b0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
d0c0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
d0d0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
d0e0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73         zType = s
d0f0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65  qlite3ColumnType
d100: 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  (&pTab->aCol[iCo
d110: 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  l],0);.        }
d120: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
d130: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
d140: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
d150: 2d 3e 70 50 61 72 73 65 20 26 26 20 70 54 61 62  ->pParse && pTab
d160: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
d170: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
d180: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
d190: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
d1a0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
d1b0: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
d1c0: 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e   zOrigDb = pNC->
d1d0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
d1e0: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
d1f0: 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
d200: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
d210: 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c  Col==XN_ROWID ||
d220: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
d230: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
d240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
d250: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
d260: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
d270: 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  R";.        }els
d280: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
d290: 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75  pe = sqlite3Colu
d2a0: 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43  mnType(&pTab->aC
d2b0: 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20  ol[iCol],0);.   
d2c0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d2e0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d2f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d300: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
d310: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
d320: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d330: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
d340: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
d350: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d360: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
d370: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
d380: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
d390: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d3a0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
d3b0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d3c0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
d3d0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
d3e0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
d3f0: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
d400: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
d410: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
d420: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
d430: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
d440: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d450: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
d460: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
d470: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
d480: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
d490: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
d4a0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
d4b0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
d4c0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d4d0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d4e0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d4f0: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20  ab, &zOrigCol); 
d500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d510: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
d520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d530: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
d540: 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f  DATA  .  if( pzO
d550: 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73  rigDb ){.    ass
d560: 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26  ert( pzOrigTab &
d570: 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20  & pzOrigCol );. 
d580: 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a     *pzOrigDb = z
d590: 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f  OrigDb;.    *pzO
d5a0: 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61  rigTab = zOrigTa
d5b0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f  b;.    *pzOrigCo
d5c0: 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20  l = zOrigCol;.  
d5d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
d5e0: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
d5f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d600: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
d610: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
d620: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
d630: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
d640: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
d650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
d660: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
d670: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
d680: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
d690: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
d6a0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
d6b0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
d6c0: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
d6d0: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
d6e0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
d6f0: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
d700: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
d710: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d720: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
d730: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
d740: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
d750: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
d760: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
d770: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
d780: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
d790: 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20  ;.  sNC.pNext = 
d7a0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
d7b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
d7c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
d7d0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d7e0: 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74  pExpr;.    const
d7f0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69   char *zType;.#i
d800: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d810: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
d820: 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  TA.    const cha
d830: 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  r *zOrigDb = 0;.
d840: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d850: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
d860: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
d870: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rigCol = 0;.    
d880: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
d890: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
d8a0: 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c  igDb, &zOrigTab,
d8b0: 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20   &zOrigCol);..  
d8c0: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
d8d0: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
d8e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
d8f0: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
d900: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
d910: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
d920: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
d930: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
d940: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
d950: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
d960: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
d970: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d980: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d990: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
d9a0: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
d9b0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d9c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d9d0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d9e0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
d9f0: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
da00: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
da10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
da20: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
da30: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
da40: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
da50: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
da60: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
da70: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
da80: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
da90: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
daa0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
dab0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
dac0: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
dad0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
dae0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
daf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
db00: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
db10: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
db20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
db30: 73 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  s for a SELECT s
db40: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
db50: 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74  The only guarant
db60: 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d  ee that SQLite m
db70: 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  akes about colum
db80: 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20  n names is that 
db90: 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  if the.** column
dba0: 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73   has an AS claus
dbb0: 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  e assigning it a
dbc0: 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c   name, that will
dbd0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65   be the name use
dbe0: 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68  d..** That is th
dbf0: 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65  e only documente
dc00: 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f  d guarantee.  Ho
dc10: 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73  wever, countless
dc20: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a   applications.**
dc30: 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20   developed over 
dc40: 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d  the years have m
dc50: 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73  ade baseless ass
dc60: 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63  umptions about c
dc70: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61  olumn names.** a
dc80: 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66  nd will break if
dc90: 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f   those assumptio
dca0: 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e  ns changes.  Hen
dcb0: 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20  ce, use extreme 
dcc0: 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20  caution.** when 
dcd0: 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72  modifying this r
dce0: 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20  outine to avoid 
dcf0: 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e  breaking legacy.
dd00: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a  .**.** See Also:
dd10: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
dd20: 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a  romExprList().**
dd30: 0a 2a 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73  .** The PRAGMA s
dd40: 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  hort_column_name
dd50: 73 20 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c  s and PRAGMA ful
dd60: 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73  l_column_names s
dd70: 65 74 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64  ettings are.** d
dd80: 65 70 72 65 63 61 74 65 64 2e 20 20 54 68 65 20  eprecated.  The 
dd90: 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20  default setting 
dda0: 69 73 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c  is short=ON, ful
ddb0: 6c 3d 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66  l=OFF.  99.9% of
ddc0: 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74   all.** applicat
ddd0: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72  ions should oper
dde0: 61 74 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e  ate this way.  N
ddf0: 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
de00: 6e 65 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  need to support 
de10: 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64  the.** other mod
de20: 65 73 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a  es for legacy:.*
de30: 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46  *.**    short=OF
de40: 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  F, full=OFF:    
de50: 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73    Column name is
de60: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
de70: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
de80: 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  it.**           
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70     originally ap
deb0: 70 65 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c  pears in the SEL
dec0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
ded0: 49 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  In.**           
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20     other words, 
df00: 74 68 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65  the zSpan of the
df10: 20 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69   result expressi
df20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f  on..**.**    sho
df30: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a  rt=ON, full=OFF:
df40: 20 20 20 20 20 20 20 28 54 68 69 73 20 69 73 20         (This is 
df50: 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  the default sett
df60: 69 6e 67 29 2e 20 20 49 66 20 74 68 65 20 72 65  ing).  If the re
df70: 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 20 20 20 20 20 72 65 66 65 72 73 20 64 69 72 65       refers dire
dfa0: 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20  ctly to a table 
dfb0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65  column, then the
dfc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e   result column n
dff0: 61 6d 65 20 69 73 20 6a 75 73 74 20 74 68 65 20  ame is just the 
e000: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  table column.** 
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
e030: 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  e: COLUMN.  Othe
e040: 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
e050: 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f  .**.**    full=O
e060: 4e 2c 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20  N, short=ANY:   
e070: 20 20 20 20 49 66 20 74 68 65 20 72 65 73 75 6c      If the resul
e080: 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
e090: 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c  y to a table col
e0a0: 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  umn,.**         
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 72 65       then the re
e0d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
e0e0: 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
e0f0: 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  name.**         
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a       prefix, ex:
e120: 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20   TABLE.COLUMN.  
e130: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
e140: 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pan..*/.static v
e150: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
e160: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
e170: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
e180: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
e190: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e1a0: 65 6c 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e  elect     /* Gen
e1b0: 65 72 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erate column nam
e1c0: 65 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  es for this SELE
e1d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
e1e0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
e1f0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
e200: 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a  int i;.  Table *
e210: 70 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  pTab;.  SrcList 
e220: 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
e230: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
e240: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e250: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
e260: 20 66 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a   fullName;    /*
e270: 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66   TABLE.COLUMN if
e280: 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e   no AS clause an
e290: 64 20 69 73 20 61 20 64 69 72 65 63 74 20 74 61  d is a direct ta
e2a0: 62 6c 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74  ble ref */.  int
e2b0: 20 73 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a   srcName;     /*
e2c0: 20 43 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45   COLUMN or TABLE
e2d0: 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
e2e0: 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64   clause and is d
e2f0: 69 72 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65  irect */..#ifnde
e300: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
e310: 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68  PLAIN.  /* If th
e320: 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
e330: 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70  , skip this step
e340: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
e350: 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
e360: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
e370: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73  dif..  if( pPars
e380: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c  e->colNamesSet |
e390: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e3a0: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  ed ) return;.  /
e3b0: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  * Column names a
e3c0: 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  re determined by
e3d0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
e3e0: 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
e3f0: 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68  d select */.  wh
e400: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
e410: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
e420: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
e430: 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
e440: 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74  1,pParse,pSelect
e450: 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  ,("generating co
e460: 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b  lumn names\n"));
e470: 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53  .  pTabList = pS
e480: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70  elect->pSrc;.  p
e490: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
e4a0: 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
e4b0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
e4c0: 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
e4d0: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
e4e0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
e4f0: 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d   fullName = (db-
e500: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
e510: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
e520: 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64  ;.  srcName = (d
e530: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
e540: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
e550: 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b  !=0 || fullName;
e560: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
e570: 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69  tNumCols(v, pELi
e580: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f  st->nExpr);.  fo
e590: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
e5a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e5b0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
e5c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
e5d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d  .    assert( p!=
e5e0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
e5f0: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43   p->op!=TK_AGG_C
e600: 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67  OLUMN );  /* Agg
e610: 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20   processing has 
e620: 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20  not run yet */. 
e630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
e640: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
e650: 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20  ->pTab!=0 ); /* 
e660: 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74  Covering idx not
e670: 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20   yet coded */.  
e680: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
e690: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
e6a0: 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73    /* An AS claus
e6b0: 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66  e always takes f
e6c0: 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f  irst priority */
e6d0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
e6e0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
e6f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
e700: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e710: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
e720: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
e730: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e740: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
e750: 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f   srcName && p->o
e760: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
e770: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
e780: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
e790: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
e7a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70       pTab = p->p
e7b0: 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tab;.      asser
e7c0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
e7d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e7e0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e7f0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
e800: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
e810: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
e820: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
e830: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
e840: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
e850: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
e860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e870: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
e880: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
e890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e8a0: 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   fullName ){.   
e8b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e8c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
e8d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e8e0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
e8f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
e900: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
e910: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e920: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e930: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e940: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
e950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e960: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e970: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e980: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e990: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
e9a0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
e9b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e9c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
e9d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
e9e0: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
e9f0: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
ea00: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
ea10: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
ea20: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
ea30: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
ea40: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ea50: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
ea60: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
ea70: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
ea80: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
ea90: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
eaa0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
eab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
eac0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
ead0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
eae0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
eaf0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
eb00: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
eb10: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
eb20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
eb30: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
eb40: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
eb50: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
eb60: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
eb70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
eb80: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
eb90: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
eba0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
ebb0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
ebc0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
ebd0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
ebe0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
ebf0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
ec00: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
ec10: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
ec20: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ec30: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ec40: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ec50: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ec60: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ec70: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ec80: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ec90: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
eca0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68  _NOMEM..**.** Th
ecb0: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
ecc0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
ecd0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
ece0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
ecf0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
ed00: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
ed10: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
ed20: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
ed30: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
ed40: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
ed50: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
ed60: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
ed70: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
ed80: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
ed90: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
eda0: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
edb0: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
edc0: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
edd0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
ede0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
edf0: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
ee00: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
ee10: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
ee20: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
ee30: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
ee40: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
ee50: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
ee60: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67  *.** See Also: g
ee70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ee80: 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es().*/.int sqli
ee90: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
eea0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
eeb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
eec0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
eed0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
eee0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
eef0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
ef00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
ef10: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
ef20: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
ef30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ef40: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
ef50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
ef60: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
ef70: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
ef80: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
ef90: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
efa0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
efb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
efc0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
efd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
efe0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f000: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
f010: 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f030: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
f040: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
f050: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
f060: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
f070: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
f080: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
f090: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
f0a0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
f0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f0c0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f0d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f0e0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  t */.  char *zNa
f0f0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
f100: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
f110: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
f120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f130: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
f140: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
f150: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f170: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
f180: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
f190: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
f1a0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
f1b0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
f1c0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
f1d0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
f1e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
f1f0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
f200: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
f210: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
f220: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  =0 );.    if( nC
f230: 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20  ol>32767 ) nCol 
f240: 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65  = 32767;.  }else
f250: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
f260: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
f270: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
f280: 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
f290: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
f2a0: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
f2b0: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
f2c0: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
f2d0: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
f2e0: 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
f2f0: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
f300: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
f310: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
f320: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f330: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
f340: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
f350: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
f360: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
f370: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
f380: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
f390: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
f3a0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
f3b0: 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45       Expr *pColE
f3c0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
f3d0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c  rSkipCollate(pEL
f3e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
f3f0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
f400: 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ColExpr->op==TK_
f410: 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70  DOT ){.        p
f420: 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78  ColExpr = pColEx
f430: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
f440: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
f450: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
f460: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
f470: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54   pColExpr->op!=T
f480: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
f490: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
f4a0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
f4b0: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  N ){.        /* 
f4c0: 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20  For columns use 
f4d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
f4e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
f4f0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45  int iCol = pColE
f500: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
f510: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
f520: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
f530: 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ab;.        asse
f540: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
f550: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
f560: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
f570: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
f580: 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20  zName = iCol>=0 
f590: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
f5a0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
f5b0: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  d";.      }else 
f5c0: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
f5d0: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
f5e0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
f5f0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
f600: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
f610: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
f620: 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  ame = pColExpr->
f630: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
f640: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
f650: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
f660: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
f670: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
f680: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
f690: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
f6a0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
f6b0: 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  an;.      }.    
f6c0: 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  }.    if( zName 
f6d0: 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
f6e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
f6f0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
f700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e   }else{.      zN
f710: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
f720: 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25  intf(db,"column%
f730: 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a  d",i+1);.    }..
f740: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
f750: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
f760: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
f770: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
f780: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
f790: 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72  ppend an integer
f7a0: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20   to the name so 
f7b0: 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20  that it becomes 
f7c0: 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20  unique..    */. 
f7d0: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
f7e0: 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20  while( zName && 
f7f0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
f800: 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29  &ht, zName)!=0 )
f810: 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  {.      nName = 
f820: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f830: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
f840: 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20  ( nName>0 ){.   
f850: 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65       for(j=nName
f860: 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74  -1; j>0 && sqlit
f870: 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b  e3Isdigit(zName[
f880: 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20  j]); j--){}.    
f890: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d      if( zName[j]
f8a0: 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20  ==':' ) nName = 
f8b0: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
f8c0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
f8d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a  MPrintf(db, "%.*
f8e0: 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  z:%u", nName, zN
f8f0: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
f900: 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73     if( cnt>3 ) s
f910: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
f920: 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26  s(sizeof(cnt), &
f930: 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  cnt);.    }.    
f940: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  pCol->zName = zN
f950: 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ame;.    sqlite3
f960: 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73  ColumnProperties
f970: 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c  FromName(0, pCol
f980: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
f990: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49   && sqlite3HashI
f9a0: 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65  nsert(&ht, zName
f9b0: 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b  , pCol)==pCol ){
f9c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
f9d0: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
f9e0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  }.  }.  sqlite3H
f9f0: 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20  ashClear(&ht);. 
fa00: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
fa10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
fa20: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
fa30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
fa40: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
fa50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
fa60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fa70: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
fa80: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
fa90: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
faa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
fab0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
fac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
fae0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
faf0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
fb00: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
fb10: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
fb20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
fb30: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
fb40: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
fb50: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
fb60: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
fb70: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
fb80: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
fb90: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
fba0: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
fbb0: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
fbc0: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
fbd0: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
fbe0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
fbf0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
fc00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
fc10: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
fc20: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
fc30: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
fc40: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
fc50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fc60: 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
fc70: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
fc80: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
fc90: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
fca0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
fcb0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
fcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
fcd0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
fce0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
fcf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
fd00: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
fd10: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
fd20: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
fd30: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
fd40: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
fd50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fd60: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
fd70: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
fd80: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
fd90: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
fda0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
fdb0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
fdc0: 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72  tem *a;..  asser
fdd0: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
fde0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
fdf0: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
fe00: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
fe10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
fe20: 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74  b->nCol==pSelect
fe30: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
fe40: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
fe50: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
fe60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
fe70: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
fe80: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
fe90: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53  (sNC));.  sNC.pS
fea0: 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
feb0: 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53  ->pSrc;.  a = pS
fec0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
fed0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
fee0: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
fef0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
ff00: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f   pCol++){.    co
ff10: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
ff20: 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20  .    int n, m;. 
ff30: 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70     p = a[i].pExp
ff40: 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  r;.    zType = c
ff50: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
ff60: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  p, 0, 0, 0);.   
ff70: 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20   /* pCol->szEst 
ff80: 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20  = ... // Column 
ff90: 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c  size est for SEL
ffa0: 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72  ECT tables never
ffb0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f   used */.    pCo
ffc0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
ffd0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
ffe0: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  y(p);.    if( zT
fff0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d  ype ){.      m =
10000 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
10010 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e  (zType);.      n
10020 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
10030 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  30(pCol->zName);
10040 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61  .      pCol->zNa
10050 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  me = sqlite3DbRe
10060 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20  allocOrFree(db, 
10070 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d  pCol->zName, n+m
10080 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +2);.      if( p
10090 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  Col->zName ){.  
100a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43        memcpy(&pC
100b0 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20  ol->zName[n+1], 
100c0 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20  zType, m+1);.   
100d0 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
100e0 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48  ags |= COLFLAG_H
100f0 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a  ASTYPE;.      }.
10100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
10110 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
10120 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
10130 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
10140 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  OB;.    pColl = 
10150 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
10160 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
10170 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20     if( pColl && 
10180 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29  pCol->zColl==0 )
10190 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
101a0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
101b0 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
101c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
101d0 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
101e0 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20  Row = 1; /* Any 
101f0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77  non-zero value w
10200 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  orks */.}../*.**
10210 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
10220 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
10230 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
10240 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
10250 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
10260 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
10270 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
10280 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
10290 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
102a0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
102b0 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
102c0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
102d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
102e0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
102f0 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
10300 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
10310 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
10320 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
10330 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
10340 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
10350 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
10360 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
10370 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
10380 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
10390 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
103a0 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
103b0 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
103c0 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
103d0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
103e0 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
103f0 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
10400 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
10410 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
10420 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
10430 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
10440 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
10450 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
10460 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
10470 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
10480 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
10490 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
104a0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
104b0 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
104c0 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
104d0 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
104e0 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
104f0 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
10500 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
10510 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
10520 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
10530 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
10540 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
10550 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
10560 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
10570 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
10580 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
10590 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
105a0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
105b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
105c0 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
105d0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
105e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
105f0 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
10600 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10610 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
10620 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
10630 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
10640 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
10650 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
10660 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
10670 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
10680 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
10690 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
106a0 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
106b0 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
106c0 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
106d0 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65  .Vdbe *sqlite3Ge
106e0 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61  tVdbe(Parse *pPa
106f0 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
10700 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  se->pVdbe ){.   
10710 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
10720 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28  pVdbe;.  }.  if(
10730 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
10740 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
10750 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
10760 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
10770 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
10780 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
10790 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
107a0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
107b0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72  rn sqlite3VdbeCr
107c0 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a  eate(pParse);.}.
107d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
107e0 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
107f0 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
10800 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
10810 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
10820 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  it expressions. 
10830 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
10840 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
10850 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
10860 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
10870 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
10880 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
10890 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
108a0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
108b0 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
108c0 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
108d0 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
108e0 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
108f0 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
10900 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
10910 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
10920 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
10930 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
10940 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
10950 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
10960 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
10970 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
10980 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
10990 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
109a0 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
109b0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
109c0 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
109d0 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
109e0 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
109f0 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
10a00 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
10a10 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
10a20 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
10a30 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64  .  iLimit.** and
10a40 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
10a50 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
10a60 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
10a70 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
10a80 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
10a90 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
10aa0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
10ab0 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
10ac0 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
10ad0 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
10ae0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
10af0 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
10b00 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
10b10 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
10b20 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
10b30 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
10b40 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
10b50 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
10b60 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
10b70 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  if pLimit->pLeft
10b80 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
10b90 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
10ba0 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
10bb0 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
10bc0 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
10bd0 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
10be0 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
10bf0 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
10c00 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
10c10 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
10c20 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
10c30 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
10c40 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
10c50 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
10c60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
10c70 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
10c80 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
10c90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
10ca0 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
10cb0 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ffset;.  int n;.
10cc0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
10cd0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69   p->pLimit;..  i
10ce0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
10cf0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
10d00 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
10d10 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
10d20 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
10d30 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76  ome.  ** controv
10d40 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
10d50 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
10d60 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
10d70 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
10d80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
10d90 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
10da0 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
10db0 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
10dc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
10dd0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
10de0 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b  .  if( pLimit ){
10df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
10e00 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49  mit->op==TK_LIMI
10e10 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
10e20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d   pLimit->pLeft!=
10e30 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  0 );.    p->iLim
10e40 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
10e50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10e60 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10e70 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10e80 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10e90 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
10ea0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
10eb0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e  Limit->pLeft, &n
10ec0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10ee0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69  OP_Integer, n, i
10ef0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
10f00 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
10f10 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
10f20 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
10f30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10f40 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42  e3VdbeGoto(v, iB
10f50 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
10f60 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
10f70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c  ->nSelectRow>sql
10f80 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
10f90 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n) ){.        p-
10fa0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
10fb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
10fc0 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  )n);.        p->
10fd0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46  selFlags |= SF_F
10fe0 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20  ixedLimit;.     
10ff0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
11000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11010 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
11020 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69  it->pLeft, iLimi
11030 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
11040 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11050 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69  P_MustBeInt, iLi
11060 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
11070 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
11080 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
11090 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
110a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
110b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
110c0 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  Not, iLimit, iBr
110d0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
110e0 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
110f0 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69   if( pLimit->pRi
11100 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ght ){.      p->
11110 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
11120 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
11130 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
11140 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
11150 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
11160 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
11170 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
11180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11190 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d  ode(pParse, pLim
111a0 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66  it->pRight, iOff
111b0 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
111c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
111d0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
111e0 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76  Offset); VdbeCov
111f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
11200 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11210 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
11220 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
11230 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11240 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69  P_OffsetLimit, i
11250 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31  Limit, iOffset+1
11260 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
11270 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
11280 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
11290 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
112a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
112b0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
112c0 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  LECT./*.** Retur
112d0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
112e0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
112f0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f  ence for the iCo
11300 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  l-th column of.*
11310 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
11320 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
11330 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d-select stateme
11340 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20  nt "p".  Return 
11350 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63  NULL if.** the c
11360 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66  olumn has no def
11370 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ault collating s
11380 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  equence..**.** T
11390 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
113a0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f  uence for the co
113b0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73  mpound select is
113c0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a   taken from the.
113d0 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
113e0 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  m of the select 
113f0 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61  that has a colla
11400 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
11410 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71  /.static CollSeq
11420 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c   *multiSelectCol
11430 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
11440 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
11450 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c  nt iCol){.  Coll
11460 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28  Seq *pRet;.  if(
11470 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
11480 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65    pRet = multiSe
11490 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
114a0 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  se, p->pPrior, i
114b0 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Col);.  }else{. 
114c0 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
114d0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
114e0 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20  =0 );.  /* iCol 
114f0 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61  must be less tha
11500 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  n p->pEList->nEx
11510 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61  pr.  Otherwise a
11520 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20  n error would.  
11530 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72  ** have been thr
11540 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20  own during name 
11550 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77  resolution and w
11560 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65  e would not have
11570 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69   gotten.  ** thi
11580 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70  s far */.  if( p
11590 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  Ret==0 && ALWAYS
115a0 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d  (iCol<p->pEList-
115b0 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70  >nExpr) ){.    p
115c0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
115d0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
115e0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
115f0 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
11600 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
11610 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
11620 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
11630 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
11640 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  d parameter is a
11650 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
11660 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45  .** with an ORDE
11670 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69  R BY clause. Thi
11680 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11690 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
116a0 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74   a KeyInfo.** st
116b0 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65  ructure suitable
116c0 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e   for implementin
116d0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  g the ORDER BY..
116e0 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
116f0 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
11700 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
11710 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
11720 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  c. The calling.*
11730 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
11740 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e  sponsible for en
11750 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73  suring that this
11760 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76   structure is ev
11770 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65  entually.** free
11780 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  d..*/.static Key
11790 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63  Info *multiSelec
117a0 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
117b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
117c0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45  elect *p, int nE
117d0 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73  xtra){.  ExprLis
117e0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
117f0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
11800 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   nOrderBy = p->p
11810 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
11820 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11830 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
11840 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71  yInfo *pRet = sq
11850 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
11860 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e  c(db, nOrderBy+n
11870 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28  Extra, 1);.  if(
11880 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   pRet ){.    int
11890 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
118a0 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
118b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
118c0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
118d0 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79  Item = &pOrderBy
118e0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78  ->a[i];.      Ex
118f0 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65  pr *pTerm = pIte
11900 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
11910 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
11920 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
11930 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
11940 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  late ){.        
11950 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
11960 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
11970 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
11980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11990 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
119a0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
119b0 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  e, p, pItem->u.x
119c0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b  .iOrderByCol-1);
119d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
119e0 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
119f0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
11a00 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
11a10 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20  >a[i].pExpr =.  
11a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11a30 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72  xprAddCollateStr
11a40 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72  ing(pParse, pTer
11a50 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  m, pColl->zName)
11a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
11a80 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
11a90 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20  e(pRet) );.     
11aa0 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20   pRet->aColl[i] 
11ab0 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
11ac0 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Ret->aSortOrder[
11ad0 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
11ae0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
11af0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11b00 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
11b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11b20 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  CTE./*.** This r
11b30 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
11b40 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f   VDBE code to co
11b50 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpute the conten
11b60 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55  t of a WITH RECU
11b70 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f  RSIVE.** query o
11b80 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
11b90 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74  *   <recursive-t
11ba0 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70  able> AS (<setup
11bb0 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41  -query> UNION [A
11bc0 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71  LL] <recursive-q
11bd0 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20  uery>).**       
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20    \___________/ 
11c00 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
11c10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
11c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c30 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50             p->pP
11c40 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
11c50 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a            p.**.*
11c60 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78  *.** There is ex
11c70 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65  actly one refere
11c80 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72  nce to the recur
11c90 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68  sive-table in th
11ca0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  e FROM clause.**
11cb0 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75   of recursive-qu
11cc0 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68  ery, marked with
11cd0 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b   the SrcList->a[
11ce0 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
11cf0 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
11d00 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
11d10 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
11d20 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
11d30 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
11d40 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
11d50 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
11d60 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
11d70 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
11d80 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
11d90 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
11da0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
11db0 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
11dc0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
11dd0 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
11de0 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
11df0 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
11e00 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
11e10 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
11e20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
11e30 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
11e40 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
11e50 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
11e60 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
11e70 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
11e80 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
11e90 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
11ea0 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
11eb0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
11ec0 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
11ed0 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
11ee0 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
11ef0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
11f00 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
11f10 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
11f20 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
11f30 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
11f40 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
11f50 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
11f60 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
11f70 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
11f80 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
11f90 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
11fa0 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
11fb0 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
11fc0 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
11fd0 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
11fe0 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
11ff0 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
12000 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
12010 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
12020 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
12030 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
12040 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
12050 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
12060 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
12070 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
12080 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
12090 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
120a0 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
120b0 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
120c0 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
120d0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
120e0 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
120f0 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
12100 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
12110 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
12120 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
12130 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
12140 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
12150 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
12160 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
12170 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
12180 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
12190 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
121a0 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
121b0 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
121c0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
121d0 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
121e0 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
121f0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
12200 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
12210 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
12220 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
12230 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
12240 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
12250 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
12260 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
12270 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
12280 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
12290 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
122a0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
122b0 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
122c0 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
122d0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
122e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
122f0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
12300 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
12310 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
12320 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
12330 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
12340 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
12350 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
12360 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
12370 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
12380 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
12390 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
123a0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
123b0 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
123c0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
123d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
123e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
123f0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
12400 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
12410 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
12420 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
12430 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
12440 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
12450 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
12460 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
12470 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
12480 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
12490 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
124a0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
124b0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
124c0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
124d0 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
124e0 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
124f0 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
12500 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
12510 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
12520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
12530 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
12540 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
12550 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
12560 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
12570 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
12580 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
12590 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
125a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
125b0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
125c0 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
125d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
125e0 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
125f0 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
12600 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
12610 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
12620 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
12630 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
12640 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
12650 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
12660 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
12670 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
12680 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
12690 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
126c0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
126f0 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
12700 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
12710 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
12720 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
12730 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12750 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
12760 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
12770 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
12780 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
12790 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
127a0 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
127b0 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
127c0 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
127d0 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
127e0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
127f0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12800 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
12810 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
12820 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
12830 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
12840 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
12850 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
12860 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
12870 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
12880 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
12890 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63  (v);.  p->nSelec
128a0 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
128b0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
128c0 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
128d0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
128e0 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  , p, addrBreak);
128f0 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  .  pLimit = p->p
12900 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69  Limit;.  regLimi
12910 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
12920 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
12930 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
12940 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  imit = 0;.  p->i
12950 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
12960 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
12970 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12980 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
12990 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
129a0 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
129b0 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
129c0 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
129d0 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
129e0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
129f0 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
12a00 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
12a10 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
12a20 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
12a30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
12a40 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12a50 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
12a60 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
12a70 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
12a80 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
12a90 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
12aa0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
12ab0 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
12ac0 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
12ad0 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
12ae0 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
12af0 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
12b00 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
12b10 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
12b20 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
12b30 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
12b40 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
12b50 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12b60 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
12b70 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
12b80 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
12b90 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
12ba0 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
12bb0 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
12bc0 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
12bd0 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
12be0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12bf0 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
12c00 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
12c10 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
12c20 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
12c30 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
12c40 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
12c50 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
12c60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12c70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c80 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
12c90 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
12ca0 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
12cb0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12cc0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
12cd0 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
12ce0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
12cf0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
12d00 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
12d10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12d20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12d30 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12d40 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
12d70 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
12d80 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
12d90 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12da0 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
12db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12dc0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12dd0 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
12de0 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
12df0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
12e00 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
12e10 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
12e20 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
12e30 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
12e40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12e50 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12e60 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
12e70 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
12e80 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
12e90 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
12ea0 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
12eb0 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
12ec0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
12ed0 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
12ee0 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
12ef0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12f00 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
12f10 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
12f20 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
12f30 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
12f40 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12f50 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
12f60 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
12f70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
12f80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
12f90 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
12fa0 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
12fb0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
12fc0 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
12fd0 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
12fe0 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
12ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13000 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
13010 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
13020 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13030 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
13040 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
13050 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
13060 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
13070 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13080 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
13090 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
130a0 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
130b0 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
130c0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
130d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
130e0 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
130f0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
13100 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
13110 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
13120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13130 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
13140 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
13150 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
13160 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13170 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
13180 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
13190 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
131a0 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
131b0 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
131c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
131d0 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
131e0 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
131f0 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
13200 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
13210 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c  se, p, iCurrent,
13220 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
13230 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
13240 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
13250 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
13260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13270 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
13280 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
13290 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
132a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
132b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
132c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
132d0 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
132e0 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
132f0 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
13300 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
13310 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
13320 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
13330 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
13340 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
13350 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13360 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
13370 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13380 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
13390 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
133a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
133b0 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
133c0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
133d0 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
133e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
133f0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  Prior = 0;.    s
13400 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
13410 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
13420 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
13430 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
13440 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
13450 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
13460 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
13470 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
13480 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
13490 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
134a0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
134b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
134c0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
134d0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
134e0 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
134f0 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
13500 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
13510 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
13520 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
13530 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
13540 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
13550 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e  pLimit;.  return
13560 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
13570 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
13580 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
13590 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
135a0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
135b0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
135c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
135d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
135e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
135f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13600 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
13610 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
13620 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13630 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13640 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13650 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13660 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
13670 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65  * Handle the spe
13680 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63  cial case of a c
13690 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
136a0 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
136b0 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20  rom a.** VALUES 
136c0 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64  clause.  By hand
136d0 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  ling this as a s
136e0 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20  pecial case, we 
136f0 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65  avoid deep.** re
13700 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75  cursion, and thu
13710 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s do not need to
13720 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c   enforce the SQL
13730 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
13740 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20  ND_SELECT.** on 
13750 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
13760 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  .**.** Because t
13770 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
13780 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
13790 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
137a0 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65  :.**   (1) There
137b0 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20   is no LIMIT or 
137c0 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74  OFFSET or else t
137d0 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20  here is a LIMIT 
137e0 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20  of exactly 1.** 
137f0 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
13800 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
13810 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
13820 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
13830 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49  se.**.** The "LI
13840 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31  MIT of exactly 1
13850 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74  " case of condit
13860 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62  ion (1) comes ab
13870 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45  out when a VALUE
13880 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75  S.** clause occu
13890 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72  rs within scalar
138a0 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a   expression (ex:
138b0 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53   "SELECT (VALUES
138c0 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a  (1),(2),(3))")..
138d0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f  ** The sqlite3Co
138e0 64 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c  deSubselect will
138f0 20 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20   have added the 
13900 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69  LIMIT 1 clause i
13910 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53  n tht case..** S
13920 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69  ince the limit i
13930 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20  s exactly 1, we 
13940 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61  only need to eva
13950 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d  lutes the left-m
13960 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73  ost VALUES..*/.s
13970 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13980 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50  electValues(.  P
13990 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
139a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
139b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
139c0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
139d0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
139e0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
139f0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
13a00 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
13a10 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
13a20 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
13a30 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
13a40 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a  Select *pPrior;.
13a50 20 20 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74    Select *pRight
13a60 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 69 6e 74 20  most = p;.  int 
13a70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20  nRow = 1;.  int 
13a80 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
13a90 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
13aa0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b  SF_MultiValue );
13ab0 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72  .  do{.    asser
13ac0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
13ad0 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20   SF_Values );.  
13ae0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
13af0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f  =TK_ALL || (p->o
13b00 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20  p==TK_SELECT && 
13b10 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b  p->pPrior==0) );
13b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13b30 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pNext==0 || p->p
13b40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d  EList->nExpr==p-
13b50 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e  >pNext->pEList->
13b60 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28  nExpr );.    if(
13b70 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
13b80 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
13b90 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  t( p->pPrior->pN
13ba0 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20  ext==p );.    p 
13bb0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
13bc0 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c   nRow++;.  }whil
13bd0 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  e(1);.  while( p
13be0 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   ){.    pPrior =
13bf0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
13c00 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
13c10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13c20 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
13c30 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e   pDest);.    p->
13c40 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
13c50 0a 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 70  .    if( rc || p
13c60 52 69 67 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69  Rightmost->pLimi
13c70 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  t ) break;.    p
13c80 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
13c90 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
13ca0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
13cb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13cc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13cd0 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
13ce0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
13cf0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
13d00 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
13d10 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
13d20 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
13d30 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
13d40 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
13d50 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
13d60 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
13d70 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
13d80 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
13d90 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
13da0 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
13db0 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
13dc0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
13dd0 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
13de0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
13df0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
13e00 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
13e10 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
13e20 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
13e30 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
13e40 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
13e50 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
13e60 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
13e70 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
13e80 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
13e90 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
13ea0 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
13eb0 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
13ec0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
13ed0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
13ee0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
13ef0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
13f00 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
13f10 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
13f20 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
13f30 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
13f40 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
13f50 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
13f60 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
13f70 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
13f80 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
13f90 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
13fa0 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
13fb0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
13fc0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
13fd0 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
13fe0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
13ff0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
14000 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
14010 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
14020 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14030 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
14040 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
14050 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
14060 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
14070 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
14080 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
14090 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
140a0 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
140b0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
140c0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
140d0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
140e0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
140f0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
14100 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
14110 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
14120 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
14130 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
14140 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
14150 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
14160 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
14170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14180 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
14190 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
141a0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
141b0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
141c0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
141d0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
141e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
141f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
14200 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
14210 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
14220 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
14230 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
14240 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
14250 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
14260 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
14270 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
14280 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14290 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
142a0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
142b0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
142c0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
142d0 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
142e0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
142f0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
14300 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
14310 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
14320 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
14330 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14340 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
14350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14360 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
14370 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
14380 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
14390 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
143a0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
143b0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
143c0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
143d0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
143e0 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
143f0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
14400 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
14410 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
14420 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
14430 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
14440 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
14450 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
14460 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
14470 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
14480 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
14490 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
144a0 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
144b0 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
144c0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
144d0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
144e0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
144f0 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
14500 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
14510 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
14520 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14530 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
14540 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
14550 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
14560 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c  ior->pOrderBy ||
14570 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
14580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
14590 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
145a0 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  s clause should 
145b0 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
145c0 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
145d0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
145e0 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59  y!=0 ? "ORDER BY
145f0 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c  " : "LIMIT", sel
14600 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
14610 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
14620 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14630 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
14640 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14650 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
14660 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
14670 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65  /* The VDBE alre
14680 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63  ady created by c
14690 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
146a0 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
146b0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
146c0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
146d0 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
146e0 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  /.  if( dest.eDe
146f0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
14700 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14710 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14730 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14740 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44  emeral, dest.iSD
14750 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
14760 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
14770 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
14780 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
14790 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
147a0 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
147b0 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
147c0 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
147d0 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
147e0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
147f0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
14800 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
14810 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
14820 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
14830 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
14840 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
14850 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
14860 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
14870 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
14880 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
14890 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
148a0 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
148b0 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
148c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
148d0 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
148e0 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
148f0 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
14900 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr==pPrior->pELi
14910 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69  st->nExpr );..#i
14920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14930 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
14940 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
14950 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
14960 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
14970 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
14980 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
14990 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
149a0 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
149b0 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
149c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
149d0 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
149e0 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
149f0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
14a00 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
14a10 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
14a20 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
14a30 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
14a40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
14a50 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
14a60 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
14a70 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
14a80 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
14a90 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
14aa0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
14ab0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
14ac0 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
14ad0 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
14ae0 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
14af0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
14b00 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
14b10 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
14b20 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14b30 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
14b40 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14b50 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
14b60 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
14b70 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
14b80 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
14b90 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14ba0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
14bb0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
14bc0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
14bd0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
14be0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
14bf0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
14c00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
14c10 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
14c20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
14c30 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
14c40 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
14c50 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
14c60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
14c70 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
14c80 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
14c90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
14ca0 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  fNot, p->iLimit)
14cb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14cc0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
14cd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
14ce0 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
14cf0 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
14d00 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73      if( p->iOffs
14d10 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
14d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14d30 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
14d40 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69   p->iLimit, p->i
14d70 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66  Offset+1, p->iOf
14d80 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
14d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
14da0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14db0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14dc0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14dd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14de0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14df0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
14e00 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14e10 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
14e20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
14e30 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14e40 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
14e50 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
14e60 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
14e70 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
14e80 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
14e90 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
14ea0 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
14eb0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
14ec0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
14ed0 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
14ee0 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69  mit->pLeft, &nLi
14ef0 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e  mit).       && n
14f00 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53  Limit>0 && p->nS
14f10 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74  electRow > sqlit
14f20 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14f30 69 6d 69 74 29 20 0a 20 20 20 20 20 20 29 7b 0a  imit) .      ){.
14f40 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
14f50 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
14f60 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69  ogEst((u64)nLimi
14f70 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
14f80 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
14f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14fa0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14fb0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
14fc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14fd0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
14fe0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
14ff0 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
15000 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
15010 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
15020 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
15030 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
15040 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
15050 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
15060 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
15070 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
15080 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
15090 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
150a0 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
150b0 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
150c0 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
150d0 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
150e0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
150f0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
15100 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
15110 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
15120 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
15130 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
15140 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15150 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
15160 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15170 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
15180 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
15190 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
151a0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
151b0 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
151c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
151d0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
151e0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
151f0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
15200 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
15210 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
15220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15230 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
15240 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
15250 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
15260 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
15270 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
15280 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50  nTab = dest.iSDP
15290 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
152a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
152b0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
152c0 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
152d0 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
152e0 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
152f0 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
15300 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
15310 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
15320 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
15330 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
15340 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15350 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
15360 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15370 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15380 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
15390 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
153a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
153b0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
153c0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
153d0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
153e0 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
153f0 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73      findRightmos
15400 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  t(p)->selFlags |
15410 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
15420 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  al;.        asse
15430 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15440 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15450 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
15460 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
15470 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
15480 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
15490 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
154a0 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  By );.      sqli
154b0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
154c0 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
154d0 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
154e0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
154f0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
15500 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15510 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15520 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15530 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
15540 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
15550 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
15560 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
15570 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
15580 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15590 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
155a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
155b0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
155c0 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
155d0 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
155e0 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
155f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15600 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15610 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
15620 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
15630 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
15640 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
15650 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
15660 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
15670 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
15680 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
15690 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
156a0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
156b0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
156c0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
156d0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
156e0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
156f0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
15700 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
15710 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15720 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15730 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
15740 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
15750 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
15760 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
15770 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
15780 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
15790 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
157a0 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
157b0 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
157c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
157d0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
157e0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
157f0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15800 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15810 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15820 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
15830 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
15840 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
15850 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ION ){.        p
15860 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
15870 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
15880 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
15890 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
158a0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
158b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
158c0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
158d0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
158e0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
158f0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
15900 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  0;.      p->iOff
15910 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  set = 0;..      
15920 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64  /* Convert the d
15930 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f  ata in the tempo
15940 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20  rary table into 
15950 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20  whatever form.  
15960 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61      ** it is tha
15970 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e  t we currently n
15980 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eed..      */.  
15990 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f      assert( unio
159a0 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61  nTab==dest.iSDPa
159b0 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74  rm || dest.eDest
159c0 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20  !=priorOp );.   
159d0 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
159e0 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
159f0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
15a00 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
15a10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15a20 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
15a30 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
15a40 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15a50 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
15a60 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
15a70 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15a80 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
15a90 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
15aa0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
15ab0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15ac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ad0 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e  OP_Rewind, union
15ae0 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  Tab, iBreak); Vd
15af0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15b00 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
15b10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15b20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
15b30 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
15b40 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e  op(pParse, p, un
15b50 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
15b80 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
15b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15ba0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15bb0 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  iCont);.        
15bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15bd0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e  2(v, OP_Next, un
15be0 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b  ionTab, iStart);
15bf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15c00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15c10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15c20 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
15c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15c40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
15c50 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
15c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15c80 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
15c90 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
15ca0 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
15cb0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
15cc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
15cd0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
15ce0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
15cf0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74  Limit;.      int
15d00 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
15d10 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
15d20 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
15d30 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
15d40 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
15d50 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
15d60 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
15d70 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
15d80 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
15d90 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
15da0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
15db0 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
15dc0 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
15dd0 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
15de0 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
15df0 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
15e00 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15e10 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
15e20 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
15e30 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
15e40 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
15e50 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15e60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e70 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15e80 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
15e90 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15ea0 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
15eb0 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15ec0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15ed0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e   addr;.      fin
15ee0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73  dRightmost(p)->s
15ef0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
15f00 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
15f10 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
15f20 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
15f30 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
15f40 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
15f50 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
15f60 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
15f70 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
15f80 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
15f90 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
15fa0 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
15fb0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
15fc0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
15fd0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
15fe0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
15ff0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
16000 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
16010 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
16020 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
16030 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
16040 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
16050 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
16060 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
16070 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
16080 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
16090 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
160a0 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
160b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
160c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
160d0 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
160e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
160f0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
16100 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
16110 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
16120 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
16130 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
16140 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
16150 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
16160 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
16170 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
16180 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62  st.iSDParm = tab
16190 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  2;.      explain
161a0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
161b0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
161c0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
161d0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
161e0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
161f0 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
16200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
16220 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
16230 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
16240 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
16250 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
16260 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72  ->nSelectRow>pPr
16270 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
16280 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
16290 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
162a0 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  tRow;.      sqli
162b0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
162c0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
162d0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
162e0 70 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 20 20 2f  pLimit;..      /
162f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16300 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
16310 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
16320 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
16330 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
16340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
16350 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
16360 29 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20  );.      iBreak 
16370 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16380 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
16390 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
163a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
163b0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
163c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
163d0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
163e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
163f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16400 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
16410 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
16420 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31  age(v);.      r1
16430 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16440 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16450 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
16460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16470 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61  , OP_RowData, ta
16480 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
16490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
164a0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
164b0 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
164c0 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
164d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
164e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
164f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16500 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
16510 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
16520 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20   p, tab1,.      
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
16550 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
16560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16570 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
16580 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
16590 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165a0 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
165b0 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
165c0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
165d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
165e0 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
165f0 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
16600 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16610 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
16620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16640 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
16650 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
16670 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
16680 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
16690 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
166a0 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
166b0 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
166c0 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
166d0 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
166e0 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
166f0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
16700 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
16710 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
16720 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
16730 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
16740 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
16750 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
16760 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
16770 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
16780 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
16790 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
167a0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
167b0 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
167c0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
167d0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
167e0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
167f0 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
16800 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
16810 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
16820 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
16830 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
16840 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
16850 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16860 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
16870 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16890 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
168a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
168b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
168c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
168d0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
168e0 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
168f0 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
16900 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
16910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
16920 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
16930 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
16940 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
16950 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
16960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
16970 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
16980 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
16990 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
169a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
169b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
169c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
169d0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
169e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
169f0 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
16a00 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
16a10 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
16a20 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
16a30 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
16a40 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
16a50 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
16a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
16a70 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
16a80 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
16a90 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
16aa0 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
16ab0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
16ac0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
16ad0 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
16ae0 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
16af0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
16b00 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
16b10 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
16b20 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
16b30 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
16b40 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
16b50 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
16b60 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
16b70 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
16b80 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
16b90 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
16ba0 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
16bb0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16bc0 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
16bd0 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
16be0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
16bf0 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
16c00 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
16c10 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
16c20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
16c30 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
16c40 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
16c50 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
16c60 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
16c70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16c80 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16c90 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
16ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
16cc0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16cd0 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
16ce0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16cf0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
16d00 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
16d10 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
16d20 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
16d50 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
16d60 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
16d70 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
16d80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16d90 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
16da0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
16db0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
16dc0 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
16dd0 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
16de0 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
16df0 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
16e00 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
16e10 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
16e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
16e30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16e40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
16e50 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72  ECT */../*.** Er
16e60 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
16e70 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  when two or more
16e80 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70   terms of a comp
16e90 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65  ound select have
16ea0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69   different.** si
16eb0 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ze result sets..
16ec0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
16ed0 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72  electWrongNumTer
16ee0 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  msError(Parse *p
16ef0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
16f00 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  ){.  if( p->selF
16f10 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
16f20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
16f30 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16f40 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
16f50 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
16f60 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
16f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
16f80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16f90 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
16fa0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
16fb0 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
16fc0 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
16fd0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16fe0 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
16ff0 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
17000 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d  e(p->op));.  }.}
17010 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
17020 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
17030 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
17040 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
17050 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
17060 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
17070 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
17080 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
17090 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74  ed in pIn->iSdst
170a0 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
170b0 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d  pIn->nSdst colum
170c0 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
170d0 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
170e0 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
170f0 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
17100 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
17110 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
17120 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
17130 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
17140 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
17150 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
17160 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
17170 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
17180 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
17190 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
171a0 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
171b0 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
171c0 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
171d0 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
171e0 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
171f0 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
17200 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
17210 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
17220 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
17230 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
17240 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
17250 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
17260 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
17270 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
17280 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
17290 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
172a0 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
172b0 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
172c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
172d0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
172e0 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
172f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17300 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17310 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
17320 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
17330 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
17340 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
17350 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
17360 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
17370 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
17380 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
17390 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
173a0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
173b0 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
173c0 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
173d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
173e0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
173f0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
17400 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
17410 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
17420 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
17430 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
17440 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
17450 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
17460 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
17470 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
17480 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
17490 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
174a0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
174b0 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
174c0 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
174d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
174e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
174f0 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
17500 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
17510 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17520 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
17530 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
17540 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17550 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
17560 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
17570 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
17580 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
17590 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
175a0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
175b0 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72   addr2;.    addr
175c0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
175d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
175e0 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62  t, regPrev); Vdb
175f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17600 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
17610 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17620 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
17630 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
17640 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20  , pIn->nSdst,.  
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17670 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
17680 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
17690 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
176a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
176b0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
176c0 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  ddr2+2, iContinu
176d0 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62  e, addr2+2); Vdb
176e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
176f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17700 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
17710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17720 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
17730 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  y, pIn->iSdst, r
17740 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
17750 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Sdst-1);.    sql
17760 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17770 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
17780 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
17790 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
177a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
177b0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
177c0 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72  Suppress the fir
177d0 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
177e0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
177f0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
17800 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
17810 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
17820 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61  iContinue);..  a
17830 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17840 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
17850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  );.  assert( pDe
17860 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54  st->eDest!=SRT_T
17870 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68  able );.  switch
17880 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
17890 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
178a0 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
178b0 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
178c0 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
178d0 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
178e0 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
178f0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17900 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17910 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
17920 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17930 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17950 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
17960 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
17970 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
17980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17990 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
179a0 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
179b0 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
179c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
179d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
179e0 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
179f0 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
17a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
17a10 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
17a20 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
17a30 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17a40 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
17a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17a60 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17a70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
17a80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17aa0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
17ab0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
17ac0 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
17ad0 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
17ae0 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20  LECT ...)"..    
17af0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17b00 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
17b10 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63   r1;.      testc
17b20 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e  ase( pIn->nSdst>
17b30 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  1 );.      r1 = 
17b40 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17b50 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17b60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17b70 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
17b80 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
17b90 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20   pIn->nSdst, .  
17ba0 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
17bb0 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e  t->zAffSdst, pIn
17bc0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17bd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
17be0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
17bf0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
17c00 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17c20 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17c30 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
17c40 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a  t->iSDParm, r1,.
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
17c70 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17c80 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17c90 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17ca0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
17cb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17cc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17cd0 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
17ce0 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
17cf0 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
17d00 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
17d10 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
17d20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
17d30 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
17d40 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
17d50 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
17d60 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
17d70 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
17d80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17d90 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
17da0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17db0 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
17dc0 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
17dd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17de0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
17df0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
17e00 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
17e10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
17e20 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
17e30 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
17e40 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
17e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17e60 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
17e70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
17e80 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
17e90 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
17ea0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
17eb0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
17ec0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
17ed0 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
17ee0 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
17ef0 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
17f00 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
17f10 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
17f20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
17f30 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
17f40 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
17f50 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
17f60 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
17f70 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
17f80 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
17f90 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
17fa0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
17fb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17fc0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
17fd0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
17fe0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17ff0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
18000 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
18010 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
18020 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
18030 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18040 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
18050 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
18060 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
18070 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
18080 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
18090 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
180a0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
180b0 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
180c0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
180d0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
180e0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
180f0 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
18100 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
18110 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
18120 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
18130 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
18140 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
18150 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
18160 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
18170 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
18180 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
18190 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
181a0 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
181b0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
181c0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
181d0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
181e0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
181f0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
18200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18210 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
18220 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
18230 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
18240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18250 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
18260 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
18270 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
18280 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
18290 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
182a0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
182b0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
182c0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
182d0 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
182e0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
182f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18300 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
18310 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
18320 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
18330 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18340 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
18350 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
18360 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
18370 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18380 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
18390 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
183a0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
183b0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
183c0 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
183d0 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
183e0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
183f0 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
18400 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
18410 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
18420 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
18430 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
18440 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
18450 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
18460 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
18470 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
18480 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
18490 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
184a0 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
184b0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
184c0 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
184d0 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
184e0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
184f0 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
18500 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
18510 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
18520 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
18530 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
18540 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
18550 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
18560 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
18570 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
18580 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
18590 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
185a0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
185b0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
185c0 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
185d0 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
185e0 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
185f0 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
18600 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
18610 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
18620 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
18630 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
18640 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
18650 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
18660 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
18670 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
18680 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
18690 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
186a0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
186b0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
186c0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
186d0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
186e0 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
186f0 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
18700 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
18710 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
18720 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
18730 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
18740 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
18750 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
18760 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
18770 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
18780 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18790 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
187a0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
187b0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
187c0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
187d0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
187e0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
187f0 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
18800 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
18810 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
18820 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
18830 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
18840 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
18850 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
18860 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
18870 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
18880 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
18890 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
188a0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
188b0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
188c0 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
188d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
188e0 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
188f0 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
18900 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
18910 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
18920 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
18930 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
18940 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
18950 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
18960 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
18970 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
18980 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
18990 20 2d 2d 2d 2d 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 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
189c0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
189d0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
189e0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
189f0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
18a00 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
18a10 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
18a20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18a30 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
18a40 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
18a50 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
18a60 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
18a70 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18a80 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18a90 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
18aa0 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
18ab0 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
18ac0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
18ad0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
18ae0 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
18af0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
18b00 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
18b10 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
18b20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
18b30 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18b40 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
18b50 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
18b60 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
18b70 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
18b80 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
18b90 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
18ba0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
18bb0 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
18bc0 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
18bd0 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
18be0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
18bf0 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
18c00 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
18c10 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
18c20 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
18c30 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
18c40 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
18c50 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
18c60 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
18c70 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
18c80 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
18c90 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
18ca0 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
18cb0 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
18cc0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
18cd0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
18ce0 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
18cf0 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
18d00 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
18d10 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
18d20 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
18d30 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
18d40 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
18d50 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
18d60 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
18d70 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
18d80 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
18d90 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
18da0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
18db0 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
18dc0 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
18dd0 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
18de0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
18df0 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
18e00 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
18e10 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
18e20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
18e30 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
18e40 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
18e50 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
18e60 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
18e70 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
18e80 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
18e90 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
18ea0 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
18eb0 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
18ec0 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
18ed0 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
18ee0 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
18ef0 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
18f00 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
18f10 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
18f20 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
18f30 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
18f40 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
18f50 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
18f60 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
18f70 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
18f80 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
18f90 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
18fa0 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
18fb0 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
18fc0 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
18fd0 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
18fe0 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
18ff0 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
19000 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
19010 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
19020 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
19030 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
19040 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
19050 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
19060 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
19070 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
19080 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
19090 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
190a0 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
190b0 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
190c0 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
190d0 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
190e0 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
190f0 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
19100 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
19110 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
19120 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
19130 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
19140 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19150 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
19160 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
19170 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
19180 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
19190 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
191a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
191b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
191c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
191d0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
191e0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
191f0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
19200 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
19210 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
19220 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
19230 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
19240 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
19250 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
19260 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
19270 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
19280 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
19290 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
192a0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
192b0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
192c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
192d0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
192e0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
192f0 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
19300 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
19310 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
19320 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
19330 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
19340 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
19350 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
19360 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
19370 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
19380 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
19390 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
193a0 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
193b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
193c0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
193d0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
193e0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
193f0 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
19400 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
19410 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
19420 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
19430 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
19440 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
19450 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
19460 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
19470 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
19480 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
19490 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
194a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
194b0 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
194c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
194d0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
194e0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
194f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
19500 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
19510 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
19520 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
19530 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19540 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
19550 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19560 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
19570 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19580 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
19590 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
195a0 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
195b0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
195c0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
195d0 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
195e0 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
195f0 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
19600 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
19610 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
19620 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19630 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
19640 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
19650 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
19660 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
19670 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
19680 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
19690 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
196a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
196b0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
196c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
196d0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
196e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
196f0 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
19700 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19710 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
19720 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
19730 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19740 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
19750 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
19760 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
19770 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
19780 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
19790 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
197a0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
197b0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
197c0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
197d0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
197e0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
197f0 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
19800 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
19810 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
19820 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
19830 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
19840 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
19850 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
19860 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
19870 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
19880 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
19890 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
198a0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
198b0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
198c0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
198d0 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
198e0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
198f0 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
19900 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
19910 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
19920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
19930 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
19940 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
19950 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
19960 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
19970 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
19980 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
19990 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
199a0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
199b0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
199c0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
199d0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
199e0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
199f0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
19a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
19a10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19a20 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
19a30 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
19a40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19a50 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
19a60 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
19a70 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
19a80 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
19a90 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
19aa0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
19ab0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
19ac0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
19ad0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
19ae0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
19af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
19b00 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
19b10 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
19b20 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
19b30 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
19b40 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
19b50 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
19b60 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
19b70 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
19b80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
19b90 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
19ba0 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
19bb0 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
19bc0 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
19bd0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
19be0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
19bf0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
19c00 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
19c10 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
19c20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
19c30 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
19c40 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
19c50 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
19c60 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
19c70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19c80 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
19c90 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19ca0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
19cb0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
19cc0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
19cd0 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
19ce0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
19cf0 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
19d00 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
19d10 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
19d20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
19d30 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
19d40 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
19d50 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
19d60 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
19d70 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
19d80 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
19d90 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
19da0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
19db0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
19dc0 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
19dd0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
19de0 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
19df0 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
19e00 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
19e10 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
19e20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
19e30 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
19e40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
19e50 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
19e60 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
19e70 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
19e80 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
19e90 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
19ea0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
19eb0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
19ec0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
19ed0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19ee0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19ef0 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
19f00 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
19f10 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
19f20 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
19f30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
19f40 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
19f50 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
19f60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
19f70 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
19f80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
19f90 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
19fa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19fb0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19fc0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
19fd0 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
19fe0 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
19ff0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
1a000 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1a010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1a020 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1a030 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
1a040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
1a050 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
1a060 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
1a070 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1a080 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
1a090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1a0a0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
1a0b0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
1a0c0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
1a0d0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
1a0e0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
1a0f0 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
1a100 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
1a110 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
1a120 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
1a130 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
1a140 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
1a150 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
1a160 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
1a170 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1a180 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
1a190 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
1a1a0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
1a1b0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
1a1c0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
1a1d0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
1a1e0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
1a1f0 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
1a200 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
1a210 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
1a220 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
1a230 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
1a240 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
1a250 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1a260 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1a270 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
1a280 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
1a290 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
1a2a0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1a2b0 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
1a2c0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1a2d0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1a2e0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1a2f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1a300 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1a310 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
1a320 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1a330 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
1a340 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
1a350 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
1a360 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
1a370 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
1a380 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
1a390 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
1a3a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
1a3b0 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
1a3c0 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
1a3d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a3e0 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
1a3f0 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
1a400 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1a410 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1a420 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1a430 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
1a440 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
1a450 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1a460 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
1a470 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
1a480 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
1a490 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
1a4a0 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
1a4b0 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
1a4c0 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
1a4d0 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
1a4e0 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
1a4f0 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1a500 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
1a510 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
1a520 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1a530 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
1a540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a550 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
1a560 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1a570 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1a580 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
1a590 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a5a0 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
1a5b0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1a5c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1a5d0 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
1a5e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1a600 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
1a610 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
1a620 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
1a630 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
1a640 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
1a650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1a660 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
1a670 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
1a680 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1a690 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
1a6a0 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
1a6b0 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
1a6c0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
1a6d0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
1a6e0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1a6f0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a700 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1a710 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
1a720 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
1a730 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
1a740 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
1a750 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
1a760 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
1a770 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
1a780 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
1a790 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
1a7a0 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
1a7b0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1a7c0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
1a7d0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
1a7e0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1a7f0 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1a800 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
1a810 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1a820 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
1a830 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
1a840 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
1a850 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1a860 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1a870 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
1a880 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
1a890 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a8a0 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
1a8b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a8c0 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
1a8d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a8e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a8f0 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
1a900 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
1a910 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
1a920 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
1a950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1a970 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
1a980 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
1a990 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
1a9a0 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
1a9b0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1a9c0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1a9d0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
1a9e0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  >pLimit = 0;..  
1a9f0 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
1aa00 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1aa10 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
1aa20 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1aa30 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1aa40 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
1aa50 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1aa60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1aa70 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
1aa80 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1aa90 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1aaa0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1aab0 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
1aac0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1aad0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
1aae0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
1aaf0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
1ab00 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1ab10 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
1ab20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1ab30 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
1ab40 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
1ab50 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
1ab60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1ab70 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1ab80 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1ab90 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1aba0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1abb0 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
1abc0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
1abd0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
1abe0 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
1abf0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
1ac00 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
1ac10 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
1ac20 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
1ac30 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
1ac40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1ac50 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1ac60 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
1ac70 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1ac80 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b  ne(v, regAddrA);
1ac90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1aca0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1acb0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1acc0 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1acd0 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1ace0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
1acf0 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
1ad00 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
1ad10 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
1ad20 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
1ad30 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1ad40 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
1ad50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ad60 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1ad70 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c  utine, regAddrB,
1ad80 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29   0, addrSelectB)
1ad90 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1ada0 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43  (v, "right SELEC
1adb0 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
1adc0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
1add0 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
1ade0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
1adf0 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1ae00 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
1ae10 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
1ae20 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
1ae30 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
1ae40 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
1ae50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1ae60 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
1ae70 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
1ae80 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
1ae90 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
1aea0 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
1aeb0 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1aec0 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  v, regAddrB);.. 
1aed0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1aee0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1aef0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1af00 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
1af10 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1af20 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1af30 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1af40 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1af50 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1af60 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1af70 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
1af80 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
1af90 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1afa0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1afc0 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
1afd0 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
1afe0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1aff0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1b000 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
1b010 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1b020 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1b030 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1b040 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
1b050 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1b060 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1b070 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1b080 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
1b090 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1b0a0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1b0b0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1b0c0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1b0d0 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
1b0e0 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
1b0f0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1b100 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1b110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b120 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
1b130 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1b150 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1b160 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
1b170 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
1b180 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
1b190 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1b1a0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1b1b0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1b1c0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1b1d0 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
1b1e0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1b1f0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
1b200 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1b210 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
1b220 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
1b230 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b240 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
1b250 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
1b260 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1b270 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b280 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
1b290 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b2a0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
1b2b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b2c0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1b2d0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
1b2e0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
1b2f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b300 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b310 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
1b320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1b350 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1b360 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1b370 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
1b380 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
1b390 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1b3a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
1b3b0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1b3c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1b3d0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1b3e0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1b3f0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1b400 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1b410 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1b420 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1b430 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1b440 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1b450 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1b460 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1b470 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1b480 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1b490 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1b4a0 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1b4b0 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1b4c0 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1b4d0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1b4e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1b4f0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1b500 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1b510 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b520 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b530 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1b540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1b550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b560 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b570 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1b580 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b590 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b5a0 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  v, addrEofB);.  
1b5b0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1b5c0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1b5d0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
1b5e0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1b5f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
1b600 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b610 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
1b620 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b630 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b640 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1b650 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b660 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b670 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1b680 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1b690 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1b6a0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b6b0 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1b6c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b6d0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1b6e0 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1b6f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1b700 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1b710 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1b720 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1b730 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1b740 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1b750 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1b760 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1b770 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b780 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1b790 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1b7a0 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1b7b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b7c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b7d0 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1b7e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b7f0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b800 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b810 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1b820 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b830 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1b840 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1b850 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b860 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1b870 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1b880 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1b890 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1b8a0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1b8b0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1b8c0 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1b8d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b8e0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1b8f0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1b900 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1b910 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b920 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1b930 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1b940 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1b950 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b960 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1b970 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1b980 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1b990 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1b9a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1b9b0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1b9c0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1b9d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b9e0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1b9f0 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1ba00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1ba10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ba20 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1ba30 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1ba40 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1ba50 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1ba60 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1ba70 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1ba80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1ba90 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1baa0 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1bab0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1bac0 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1bad0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1bae0 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1baf0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1bb00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1bb10 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1bb20 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1bb30 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1bb60 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1bb70 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1bb80 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1bb90 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1bba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bbb0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1bbc0 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1bbd0 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1bbe0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1bbf0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1bc00 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1bc10 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1bc20 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1bc30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1bc40 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1bc50 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1bc60 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1bc70 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1bc80 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1bc90 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1bca0 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1bcb0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1bcc0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1bcd0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1bce0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1bcf0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1bd00 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1bd10 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1bd20 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1bd30 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1bd40 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1bd50 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1bd60 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1bd70 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1bd80 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1bd90 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1bda0 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1bdb0 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1bdc0 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1bdd0 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1bde0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1bdf0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1be00 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1be10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1be20 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1be30 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1be40 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1be50 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1be60 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1be70 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1be80 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1be90 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1bea0 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1beb0 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1bec0 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1bed0 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1bee0 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1bef0 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1bf00 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1bf10 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1bf20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1bf30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bf40 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1bf50 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1bf60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bf70 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1bf80 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1bf90 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1bfa0 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1bfb0 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1bfc0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1bfd0 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1bfe0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1bff0 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1c000 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1c010 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1c020 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1c030 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1c040 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1c050 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1c060 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1c070 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1c080 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1c090 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1c0a0 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1c0b0 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1c0c0 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1c0d0 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1c0e0 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1c0f0 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1c100 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c110 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1c120 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1c130 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1c140 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1c150 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1c160 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1c170 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1c180 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1c190 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1c1a0 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1c1b0 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1c1c0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1c1d0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1c1e0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1c1f0 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1c200 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1c210 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1c220 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1c230 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1c240 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1c250 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1c260 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1c270 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1c280 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1c290 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1c2a0 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1c2b0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1c2c0 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1c2d0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1c2e0 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1c2f0 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1c300 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1c310 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1c320 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1c330 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1c340 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1c350 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1c360 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1c370 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1c380 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1c390 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1c3a0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1c3b0 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1c3c0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1c3d0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1c3e0 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1c3f0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1c400 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1c410 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c420 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1c430 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52  .   && pExpr->iR
1c440 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70  ightJoinTable==p
1c450 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20  Subst->iTable.  
1c460 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52  ){.    pExpr->iR
1c470 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
1c480 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1c490 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  e;.  }.  if( pEx
1c4a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1c4b0 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1c4c0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1c4d0 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
1c4e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
1c4f0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
1c500 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
1c510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
1c520 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
1c530 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53  Expr *pCopy = pS
1c540 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ubst->pEList->a[
1c550 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1c560 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70  pExpr;.      Exp
1c570 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20  r ifNullRow;.   
1c580 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73     assert( pSubs
1c590 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20  t->pEList!=0 && 
1c5a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1c5b0 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Subst->pEList->n
1c5c0 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1c5d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1c5e0 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
1c5f0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1c600 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
1c610 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79  prIsVector(pCopy
1c620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1c630 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d  ite3VectorErrorM
1c640 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73  sg(pSubst->pPars
1c650 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20  e, pCopy);.     
1c660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c670 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53  sqlite3 *db = pS
1c680 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62  ubst->pParse->db
1c690 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1c6a0 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e  ubst->isLeftJoin
1c6b0 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54   && pCopy->op!=T
1c6c0 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
1c6d0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66        memset(&if
1c6e0 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65  NullRow, 0, size
1c6f0 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a  of(ifNullRow));.
1c700 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c            ifNull
1c710 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e  Row.op = TK_IF_N
1c720 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20  ULL_ROW;.       
1c730 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65     ifNullRow.pLe
1c740 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20  ft = pCopy;.    
1c750 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e        ifNullRow.
1c760 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d  iTable = pSubst-
1c770 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >iNewTable;.    
1c780 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69        pCopy = &i
1c790 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20  fNullRow;.      
1c7a0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77    }.        pNew
1c7b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1c7c0 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b  p(db, pCopy, 0);
1c7d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1c7e0 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c  w && pSubst->isL
1c7f0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
1c800 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
1c810 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61  erty(pNew, EP_Ca
1c820 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  nBeNull);.      
1c830 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1c840 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50  pNew && ExprHasP
1c850 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
1c860 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
1c870 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52          pNew->iR
1c880 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
1c890 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69  pExpr->iRightJoi
1c8a0 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  nTable;.        
1c8b0 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1c8c0 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a  y(pNew, EP_FromJ
1c8d0 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oin);.        }.
1c8e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c8f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1c900 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45  xpr);.        pE
1c910 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  xpr = pNew;.    
1c920 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1c930 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  e{.    if( pExpr
1c940 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c  ->op==TK_IF_NULL
1c950 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69  _ROW && pExpr->i
1c960 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1c970 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
1c980 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
1c990 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1c9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70  ;.    }.    pExp
1c9b0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
1c9c0 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78  Expr(pSubst, pEx
1c9d0 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1c9e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
1c9f0 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1ca00 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
1ca10 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
1ca20 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1ca30 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1ca40 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1ca50 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70  ect(pSubst, pExp
1ca60 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29  r->x.pSelect, 1)
1ca70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ca80 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1ca90 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1caa0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
1cab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
1cac0 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  pr;.}.static voi
1cad0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1cae0 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1caf0 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63  *pSubst, /* Desc
1cb00 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1cb10 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1cb20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1cb30 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
1cb40 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
1cb50 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1cb60 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20  titutes */.){.  
1cb70 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1cb80 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1cb90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1cba0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1cbb0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1cbc0 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1cbd0 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74  pr(pSubst, pList
1cbe0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1cbf0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
1cc00 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
1cc10 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1cc20 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1cc30 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1cc40 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  titution */.  Se
1cc50 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1cc60 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
1cc70 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
1cc80 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1cc90 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
1cca0 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  doPrior         
1ccb0 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75    /* Do substitu
1ccc0 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72  tes on p->pPrior
1ccd0 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63   too */.){.  Src
1cce0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
1ccf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1cd00 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
1cd10 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
1cd20 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  turn;.  do{.    
1cd30 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cd40 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29  ubst, p->pEList)
1cd50 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1cd60 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  ist(pSubst, p->p
1cd70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75  GroupBy);.    su
1cd80 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1cd90 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  st, p->pOrderBy)
1cda0 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
1cdb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1cdc0 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  bst, p->pHaving)
1cdd0 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
1cde0 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1cdf0 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  st, p->pWhere);.
1ce00 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53      pSrc = p->pS
1ce10 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
1ce20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66  pSrc!=0 );.    f
1ce30 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c  or(i=pSrc->nSrc,
1ce40 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20   pItem=pSrc->a; 
1ce50 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
1ce60 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53  +){.      substS
1ce70 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49  elect(pSubst, pI
1ce80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29  tem->pSelect, 1)
1ce90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1cea0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
1ceb0 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74  ){.        subst
1cec0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1ced0 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
1cee0 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Arg);.      }.  
1cef0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f    }.  }while( do
1cf00 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d  Prior && (p = p-
1cf10 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d  >pPrior)!=0 );.}
1cf20 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
1cf30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1cf40 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1cf50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1cf60 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
1cf70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1cf80 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1cf90 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1cfa0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
1cfb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cfc0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
1cfd0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61  ten subqueries a
1cfe0 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
1cff0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
1d000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1d010 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
1d020 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
1d030 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
1d040 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ng occurs..**.**
1d050 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
1d060 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
1d070 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
1d080 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1d090 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
1d0a0 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
1d0b0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
1d0c0 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1d0d0 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
1d0e0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
1d0f0 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
1d100 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
1d110 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
1d120 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
1d130 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
1d140 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
1d150 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1d160 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
1d170 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d180 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
1d190 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
1d1a0 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
1d1b0 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
1d1c0 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
1d1d0 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
1d1e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
1d1f0 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
1d200 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
1d210 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
1d220 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
1d230 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
1d240 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d250 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
1d260 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
1d270 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
1d280 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
1d290 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
1d2a0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1d2b0 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
1d2c0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1d2d0 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
1d2e0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1d2f0 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
1d300 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67  simplification g
1d310 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
1d320 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
1d330 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
1d340 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
1d350 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
1d360 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
1d370 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
1d380 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
1d390 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
1d3a0 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
1d3b0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
1d3c0 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74  ing is subject t
1d3d0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
1d3e0 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a  constraints:.**.
1d3f0 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
1d400 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
1d410 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
1d420 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
1d430 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54  Was:.**        T
1d440 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1d450 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d460 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61  cannot both be a
1d470 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d480 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1d490 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1d4a0 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1d4b0 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61  e subqueries. Wa
1d4c0 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29  s:.**        (2)
1d4d0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1d4e0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
1d4f0 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
1d500 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2a) the outer q
1d510 75 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65  uery must not be
1d520 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20   a join and.**  
1d530 20 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f        (2b) the o
1d540 75 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20  uter query must 
1d550 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69  not use subqueri
1d560 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
1d570 20 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65    other than the
1d580 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65   one FROM-clause
1d590 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69   subquery that i
1d5a0 73 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a  s a candidate.**
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1d5c0 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54   flattening.  (T
1d5d0 68 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69  his is due to ti
1d5e0 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1d5f0 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20  f9abf80].**     
1d600 20 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31          from 201
1d610 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20  5-02-09.).**.** 
1d620 20 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75    (3)  If the su
1d630 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
1d640 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1d650 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a   LEFT JOIN then.
1d660 2a 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74  **        (3a) t
1d670 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  he subquery may 
1d680 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e  not be a join an
1d690 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29  d.**        (3b)
1d6a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d6b0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1d6c0 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e   may not contain
1d6d0 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20   a virtual.**   
1d6e0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20            table 
1d6f0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  and.**        (3
1d700 63 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  c) the outer que
1d710 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e  ry may not be an
1d720 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
1d730 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
1d740 71 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65  query can not be
1d750 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1d760 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
1d770 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
1d780 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
1d790 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
1d7a0 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
1d7b0 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
1d7c0 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
1d7d0 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
1d7e0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
1d7f0 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
1d800 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
1d810 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
1d820 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
1d830 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
1d840 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1d850 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74  We no longer att
1d860 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20  empt to flatten 
1d870 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
1d880 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20  ries.  Was:.**  
1d890 20 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62        If the sub
1d8a0 71 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61  query is aggrega
1d8b0 74 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75  te, the outer qu
1d8c0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44  ery may not be D
1d8d0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1d8e0 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
1d8f0 72 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46  ry must have a F
1d900 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44  ROM clause.  TOD
1d910 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69  O:  For subqueri
1d920 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20  es without.**   
1d930 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75       A FROM clau
1d940 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64  se, consider add
1d950 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  ing a FROM claus
1d960 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  e with the speci
1d970 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62  al.**        tab
1d980 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74  le sqlite_once t
1d990 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  hat consists of 
1d9a0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e  a single row con
1d9b0 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20  taining a.**    
1d9c0 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e      single NULL.
1d9d0 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66  .**.**   (8)  If
1d9e0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1d9f0 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
1da00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1da10 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e  y not be a join.
1da20 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66  .**.**   (9)  If
1da30 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1da40 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
1da50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
1da60 79 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61  y not be aggrega
1da70 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  te..**.**  (**) 
1da80 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30   Restriction (10
1da90 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72  ) was removed fr
1daa0 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32  om the code on 2
1dab0 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65  005-02-05 but we
1dac0 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64  .**        accid
1dad0 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68  ently carried th
1dae0 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72  e comment forwar
1daf0 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d  d until 2014-09-
1db00 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a  15.  Original.**
1db10 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1db20 6e 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71  nt: "If the subq
1db30 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1db40 65 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  e then the outer
1db50 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20   query .**      
1db60 20 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49    may not use LI
1db70 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31  MIT.".**.**  (11
1db80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1db90 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1dba0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68  ery may not both
1dbb0 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1dbc0 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1dbd0 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1dbe0 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1dbf0 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1dc00 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1dc10 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1dc20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1dc30 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1dc40 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1dc50 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1dc60 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1dc70 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1dc80 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1dc90 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1dca0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   The subquery ma
1dcb0 79 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  y not use OFFSET
1dcc0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49  ..**.**  (15)  I
1dcd0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1dce0 79 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63  y is part of a c
1dcf0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1dd00 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  then the.**     
1dd10 20 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20     subquery may 
1dd20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  not use LIMIT..*
1dd30 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1dd40 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1dd50 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1dd60 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1dd70 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71    If the outer q
1dd80 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1dd90 65 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  e, then the subq
1dda0 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20  uery may not.** 
1ddb0 20 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52         use ORDER
1ddc0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1ddd0 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1dde0 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1ddf0 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1de00 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1de10 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1de20 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1de30 20 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73    (17)  If the s
1de40 75 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  ubquery is a com
1de50 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1de60 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  en.**        (17
1de70 61 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20  a) all compound 
1de80 6f 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62  operators must b
1de90 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61  e a UNION ALL, a
1dea0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37  nd.**        (17
1deb0 62 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  b) no terms with
1dec0 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20  in the subquery 
1ded0 63 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20  compound may be 
1dee0 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20  aggregate.**    
1def0 20 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53            or DIS
1df00 54 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20  TINCT, and.**   
1df10 20 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79       (17c) every
1df20 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
1df30 20 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75   subquery compou
1df40 6e 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46  nd must have a F
1df50 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ROM clause.**   
1df60 20 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f       (17d) the o
1df70 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1df80 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ot be.**        
1df90 20 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67        (17d1) agg
1dfa0 72 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20  regate, or.**   
1dfb0 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32             (17d2
1dfc0 29 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a  ) DISTINCT, or.*
1dfd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
1dfe0 31 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  17d3) a join..**
1dff0 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70  .**        The p
1e000 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75  arent and sub-qu
1e010 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ery may contain 
1e020 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53  WHERE clauses. S
1e030 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20  ubject to.**    
1e040 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20      rules (11), 
1e050 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74  (13) and (14), t
1e060 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e  hey may also con
1e070 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a  tain ORDER BY,.*
1e080 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61  *        LIMIT a
1e090 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
1e0a0 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79  s.  The subquery
1e0b0 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20   cannot use any 
1e0c0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1e0d0 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65     operator othe
1e0e0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
1e0f0 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
1e100 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a   other compound.
1e110 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1e120 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c  ors have an impl
1e130 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69  ied DISTINCT whi
1e140 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64  ch is disallowed
1e150 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65   by.**        re
1e160 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a  striction (4)..*
1e170 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f  *.**        Also
1e180 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74  , each component
1e190 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1e1a0 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68  y must return th
1e1b0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
1e1c0 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c          of resul
1e1d0 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20  t columns. This 
1e1e0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65  is actually a re
1e1f0 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e  quirement for an
1e200 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1e210 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74       SELECT stat
1e220 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74  ement, but all t
1e230 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65  he code here doe
1e240 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74  s is make sure t
1e250 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20  hat no.**       
1e260 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20   such (illegal) 
1e270 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61  sub-query is fla
1e280 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  ttened. The call
1e290 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74  er will detect t
1e2a0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e  he.**        syn
1e2b0 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65  tax error and re
1e2c0 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20  turn a detailed 
1e2d0 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20  message..**.**  
1e2e0 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62  (18)  If the sub
1e2f0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1e300 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1e310 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  n all terms of t
1e320 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44  he.**        ORD
1e330 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  ER BY clause of 
1e340 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20  the parent must 
1e350 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65  be simple refere
1e360 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20  nces to .**     
1e370 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68     columns of th
1e380 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a  e sub-query..**.
1e390 2a 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65  **  (19)  If the
1e3a0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c   subquery uses L
1e3b0 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75  IMIT then the ou
1e3c0 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1e3d0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1e3e0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1e3f0 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1e400 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1e410 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1e420 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1e430 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1e440 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1e450 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1e460 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1e470 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1e480 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1e490 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1e4a0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1e4b0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1e4c0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1e4d0 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1e4e0 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1e4f0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1e500 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1e510 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1e520 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1e530 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1e540 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1e550 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1e560 2a 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20  *  (21)  If the 
1e570 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1e580 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1e590 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1e5a0 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49   be.**        DI
1e5b0 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1e5c0 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1e5d0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1e5e0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   The subquery ma
1e5f0 79 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72  y not be a recur
1e600 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  sive CTE..**.** 
1e610 20 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20   (**)  Subsumed 
1e620 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1e630 20 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49   (17d3).  Was: I
1e640 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1e650 79 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61  y is.**        a
1e660 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1e670 74 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65  then the sub-que
1e680 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20  ry may not be a 
1e690 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
1e6a0 2a 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72  **        This r
1e6b0 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1e6c0 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1e6d0 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1e6e0 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1e6f0 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1e700 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1e710 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1e720 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1e730 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1e740 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elect()..**.**  
1e750 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67  (**)  We no long
1e760 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c  er attempt to fl
1e770 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20  atten aggregate 
1e780 73 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73  subqueries.  Was
1e790 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1e7a0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1e7b0 20 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65   be an aggregate
1e7c0 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62   that uses the b
1e7d0 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72  uilt-in min() or
1e7e0 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d   .**        or m
1e7f0 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ax() functions. 
1e800 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72   (Without this r
1e810 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75  estriction, a qu
1e820 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20  ery like:.**    
1e830 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52      "SELECT x FR
1e840 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79  OM (SELECT max(y
1e850 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77  ), x FROM t1)" w
1e860 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61  ould not necessa
1e870 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  rily.**        r
1e880 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1e890 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61  X for which Y wa
1e8a0 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a  s maximal.).**.*
1e8b0 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
1e8c0 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
1e8d0 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
1e8e0 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
1e8f0 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
1e900 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
1e910 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
1e920 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
1e930 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e940 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
1e950 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1e960 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1e970 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1e980 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1e990 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1e9a0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1e9b0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1e9c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e9d0 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1e9e0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1e9f0 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1ea00 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1ea10 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ea20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1ea30 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1ea40 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1ea50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1ea60 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1ea70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1ea80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1ea90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1eaa0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1eab0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1eac0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1ead0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1eae0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1eaf0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1eb00 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1eb10 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1eb20 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eb40 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1eb50 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1eb60 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1eb70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1eb80 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
1eb90 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
1eba0 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
1ebb0 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20  ect *pParent;   
1ebc0 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f   /* Current UNIO
1ebd0 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68  N ALL term of th
1ebe0 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f  e other query */
1ebf0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1ec00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ec10 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1ec20 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1ec30 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1ec40 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1ec50 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1ec60 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1ec70 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1ec80 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1ec90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1eca0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ecb0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1ecc0 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1ecd0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ece0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1ecf0 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
1ed00 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1ed10 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
1ed20 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
1ed30 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
1ed40 20 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74    int iNewParent
1ed50 20 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65   = -1;/* Replace
1ed60 6d 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69  ment table for i
1ed70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
1ed80 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20  isLeftJoin = 0; 
1ed90 2f 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20  /* True if pSub 
1eda0 69 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  is the right sid
1edb0 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
1edc0 20 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b   */    .  int i;
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ede0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1edf0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
1ee20 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
1ee30 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ee40 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
1ee50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
1ee60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ee70 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1ee80 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1ee90 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
1eea0 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
1eeb0 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
1eec0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  */.  assert( p!=
1eed0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1eee0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
1eef0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1ef00 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1ef10 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1ef20 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1ef30 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1ef40 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1ef50 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1ef60 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1ef70 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1ef80 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1ef90 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1efa0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1efb0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1efc0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1efd0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1efe0 29 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20  );..  pSubSrc = 
1eff0 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73  pSub->pSrc;.  as
1f000 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b  sert( pSubSrc );
1f010 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76  .  /* Prior to v
1f020 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68  ersion 3.1.2, wh
1f030 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1f040 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69  SET had to be si
1f050 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a  mple constants,.
1f060 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61    ** not arbitra
1f070 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1f080 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
1f090 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
1f0a0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1f0b0 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
1f0c0 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
1f0d0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1f0e0 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
1f0f0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1f100 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
1f110 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1f120 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
1f130 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
1f140 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
1f150 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
1f160 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f170 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
1f180 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f190 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f1a0 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
1f1b0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1f1c0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70   pSub->pLimit->p
1f1d0 52 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30  Right ) return 0
1f1e0 3b 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ;   /* Restricti
1f1f0 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
1f200 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1f210 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20  SF_Compound)!=0 
1f220 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  && pSub->pLimit 
1f230 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f270 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20  estriction (15) 
1f280 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1f290 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20  bSrc->nSrc==0 ) 
1f2a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f2d0 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  7)  */.  if( pSu
1f2e0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1f2f0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1f300 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f310 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f320 34 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  4)  */.  if( pSu
1f330 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53  b->pLimit && (pS
1f340 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
1f350 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74  Agg) ){.     ret
1f360 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1f370 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1f380 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  8)(9) */.  }.  i
1f390 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1f3a0 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1f3b0 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1f3c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f3f0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1f400 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1f410 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1f420 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1f430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f440 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f450 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1f460 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1f470 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1f480 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f490 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f4a0 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1f4b0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1f4c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f4d0 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1f4e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f4f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f500 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1f510 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  }.  if( pSub->se
1f520 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
1f530 75 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72  ursive) ){.    r
1f540 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1f550 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f  rictions (22) */
1f560 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
1f570 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f580 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1f590 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1f5a0 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  OIN, then the.  
1f5b0 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20  ** subquery may 
1f5c0 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74  not be a join it
1f5d0 73 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70  self (3a). Examp
1f5e0 6c 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  le of why this i
1f5f0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77  s not.  ** allow
1f600 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1f610 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1f620 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
1f630 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
1f640 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1f650 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1f660 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1f670 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1f680 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1f690 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
1f6a0 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
1f6b0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
1f6c0 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
1f6d0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f6e0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1f6f0 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1f700 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75  OIN, then the ou
1f710 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63  ter.  ** query c
1f720 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  annot be an aggr
1f730 65 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69  egate. (3c)  Thi
1f740 73 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74  s is an artifact
1f750 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a   of the way.  **
1f760 20 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20   aggregates are 
1f770 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72  processed - ther
1f780 65 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73  e is no mechanis
1f790 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  m to determine i
1f7a0 66 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20  f.  ** the LEFT 
1f7b0 4a 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c  JOIN table shoul
1f7c0 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20  d be all-NULL.. 
1f7d0 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
1f7e0 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20  o tickets #306, 
1f7f0 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e  #350, and #3300.
1f800 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75  .  */.  if( (pSu
1f810 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  bitem->fg.jointy
1f820 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1f830 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a  0 ){.    isLeftJ
1f840 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  oin = 1;.    if(
1f850 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31   pSubSrc->nSrc>1
1f860 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56   || isAgg || IsV
1f870 69 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e  irtual(pSubSrc->
1f880 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20  a[0].pTab) ){.  
1f890 20 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20      /*  (3a)    
1f8a0 20 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20           (3c)   
1f8b0 20 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20    (3b) */.      
1f8c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1f8d0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1f8e0 45 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f  E_EXTRA_IFNULLRO
1f8f0 57 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72  W.  else if( iFr
1f900 6f 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29  om>0 && !isAgg )
1f910 7b 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67  {.    /* Setting
1f920 20 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d   isLeftJoin to -
1f930 31 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75  1 causes OP_IfNu
1f940 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f  llRow opcodes to
1f950 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f   be generated fo
1f960 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  r.    ** every r
1f970 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
1f980 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72  result column fr
1f990 6f 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61  om subquery in a
1f9a0 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20   join, even.    
1f9b0 2a 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61  ** though they a
1f9c0 72 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  re not necessary
1f9d0 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72  .  This will str
1f9e0 65 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f  ess-test the OP_
1f9f0 49 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a  IfNullRow .    *
1fa00 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  * opcode. */.   
1fa10 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31   isLeftJoin = -1
1fa20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1fa30 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1fa40 31 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d  17): If the sub-
1fa50 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1fa60 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1fa70 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1fa80 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1fa90 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1faa0 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1fab0 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1fac0 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1fad0 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1fae0 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1faf0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1fb00 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1fb10 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1fb20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1fb30 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1fb40 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1fb50 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1fb60 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1fb70 63 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20  ction (20) */.  
1fb80 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67    }.    if( isAg
1fb90 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
1fba0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1fbb0 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
1fbc0 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
1fbd0 74 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31  turn 0; /* (17d1
1fbe0 29 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31  ), (17d2), or (1
1fbf0 37 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  7d3) */.    }.  
1fc00 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
1fc10 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
1fc20 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
1fc30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1fc40 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1fc50 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1fc60 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1fc70 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
1fc80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1fc90 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1fca0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1fcb0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1fcc0 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20  _Aggregate );.  
1fcd0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1fce0 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ->pSrc!=0 );.   
1fcf0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
1fd00 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  >pEList->nExpr==
1fd10 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1fd20 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66  Expr );.      if
1fd30 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fd40 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fd50 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fd60 21 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20  !=0    /* (17b) 
1fd70 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  */.       || (pS
1fd80 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
1fd90 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
1fda0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1fdb0 20 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20    /* (17a) */.  
1fdc0 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70       || pSub1->p
1fdd0 53 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20  Src->nSrc<1     
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fe00 28 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29  (17c) */.      )
1fe10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fe20 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1fe30 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1fe40 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  1->pSrc->nSrc>1 
1fe50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1fe60 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38   Restriction (18
1fe70 29 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  ). */.    if( p-
1fe80 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1fe90 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1fea0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d   for(ii=0; ii<p-
1feb0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1fec0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1fed0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1fee0 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64  ->a[ii].u.x.iOrd
1fef0 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74  erByCol==0 ) ret
1ff00 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1ff10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45     }.  }..  /* E
1ff20 78 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32  x-restriction (2
1ff30 33 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c  3):.  ** The onl
1ff40 79 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72  y way that the r
1ff50 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66  ecursive part of
1ff60 20 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61   a CTE can conta
1ff70 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20  in a compound.  
1ff80 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66  ** subquery is f
1ff90 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1ffa0 74 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f  to be one term o
1ffb0 66 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69  f a join.  But i
1ffc0 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
1ffd0 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74  ery is a join, t
1ffe0 68 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69  hen the flatteni
1fff0 6e 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ng has already b
20000 65 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20  een stopped by. 
20010 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   ** restriction 
20020 28 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73  (17d3).  */.  as
20030 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
20040 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
20050 65 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70  e)==0 || pSub->p
20060 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Prior==0 );..  /
20070 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
20080 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
20090 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
200a0 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20  itted. *****/.  
200b0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
200c0 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e  arse,p,("flatten
200d0 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d   %s.%p from term
200e0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
200f0 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d             pSub-
20100 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c  >zSelName, pSub,
20110 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20   iFrom));..  /* 
20120 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75  Authorize the su
20130 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72  bquery */.  pPar
20140 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
20150 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61   = pSubitem->zNa
20160 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69  me;.  TESTONLY(i
20170 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43   =) sqlite3AuthC
20180 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
20190 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
201a0 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65  , 0);.  testcase
201b0 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  ( i==SQLITE_DENY
201c0 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   );.  pParse->zA
201d0 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
201e0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
201f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62  .  /* If the sub
20200 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
20210 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
20220 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20  ement, then (by 
20230 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a  restrictions.  *
20240 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76  * 17 and 18 abov
20250 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e) it must be a 
20260 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68  UNION ALL and th
20270 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d  e parent query m
20280 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20  ust .  ** be of 
20290 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
202a0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c   **     SELECT <
202b0 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20  expr-list> FROM 
202c0 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77  (<sub-query>) <w
202d0 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20  here-clause> .  
202e0 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  **.  ** followed
202f0 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59   by any ORDER BY
20300 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f  , LIMIT and/or O
20310 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
20320 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63  his block.  ** c
20330 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65  reates N-1 copie
20340 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
20350 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
20360 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
20370 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
20380 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
20390 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
203a0 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
203b0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
203c0 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
203d0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
203e0 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
203f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
20400 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
20410 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
20420 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
20430 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a  -query..  **.  *
20440 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  * Example:.  **.
20450 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
20460 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20  a+1 FROM (.  ** 
20470 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
20480 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
20490 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
204a0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
204b0 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a  T y FROM tab.  *
204c0 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41  *        UNION A
204d0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53  LL.  **        S
204e0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46  ELECT abs(z*2) F
204f0 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20  ROM tab2.  **   
20500 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f    ) WHERE a!=5 O
20510 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
20520 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20   ** Transformed 
20530 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
20540 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46      SELECT x+1 F
20550 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b  ROM tab WHERE x+
20560 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e  1!=5.  **     UN
20570 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
20580 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d   SELECT y+1 FROM
20590 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d   tab WHERE y+1!=
205a0 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
205b0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
205c0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20  LECT abs(z*2)+1 
205d0 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20  FROM tab2 WHERE 
205e0 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20  abs(z*2)+1!=5.  
205f0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
20600 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63  1.  **.  ** We c
20610 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f  all this the "co
20620 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
20630 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a  flattening"..  *
20640 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
20650 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
20660 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
20670 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
20680 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
20690 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
206a0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
206b0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
206c0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53  p->pLimit;.    S
206d0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
206e0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
206f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
20700 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
20710 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
20720 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
20730 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
20740 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
20750 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
20760 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
20770 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75  etName(pNew, pSu
20780 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20  b->zSelName);.  
20790 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
207a0 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
207b0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
207c0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
207d0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
207e0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
207f0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
20800 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
20810 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
20820 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
20830 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
20840 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
20850 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
20860 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
20870 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
20880 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
20890 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c   pNew;.      SEL
208a0 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73  ECTTRACE(2,pPars
208b0 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22  e,p,.         ("
208c0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
208d0 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61  y flattener crea
208e0 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65  tes %s.%p as pee
208f0 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  r\n",.         p
20900 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
20910 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
20920 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20930 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
20940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
20950 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
20960 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
20970 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
20980 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
20990 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
209a0 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
209b0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
209c0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
209d0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
209e0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
209f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20a00 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
20a10 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
20a20 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
20a30 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
20a40 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
20a50 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
20a60 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
20a70 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
20a80 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
20a90 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
20aa0 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
20ab0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
20ac0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
20ad0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
20ae0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
20af0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
20b00 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
20b10 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
20b20 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
20b30 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
20b40 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
20b50 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
20b60 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
20b70 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
20b80 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
20b90 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
20ba0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
20bb0 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
20bc0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
20bd0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
20be0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
20bf0 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
20c00 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
20c10 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
20c20 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
20c30 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
20c40 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
20c50 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
20c60 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
20c70 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
20c80 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
20c90 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
20ca0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20cb0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20cc0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20cd0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
20ce0 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
20cf0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20d00 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
20d10 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
20d20 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
20d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20d40 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
20d50 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
20d60 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
20d70 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
20d80 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
20d90 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
20da0 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
20db0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
20dc0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
20dd0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
20de0 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
20df0 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
20e00 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
20e10 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
20e20 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
20e30 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
20e40 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
20e50 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
20e60 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
20e70 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
20e80 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
20e90 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
20ea0 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
20eb0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
20ec0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
20ed0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20ee0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
20ef0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
20f00 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
20f10 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
20f20 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
20f30 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
20f40 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
20f50 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
20f60 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
20f70 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
20f80 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
20f90 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
20fa0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
20fb0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
20fc0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
20fd0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
20fe0 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
20ff0 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
21000 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
21010 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
21020 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
21030 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
21040 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
21050 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
21060 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
21070 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
21080 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
21090 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
210a0 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
210b0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
210c0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
210d0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
210e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
210f0 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
21100 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
21110 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
21120 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
21130 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
21140 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
21150 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
21160 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
21170 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
21180 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
21190 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
211a0 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
211b0 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
211c0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
211d0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
211e0 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
211f0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ->fg.jointype;. 
21200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21210 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
21220 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
21230 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
21240 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
21250 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
21260 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
21270 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
21280 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
21290 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
212a0 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
212b0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
212c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
212d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
212e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
212f0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
21300 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
21310 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
21320 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
21330 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
21340 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
21350 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
21360 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
21370 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
21380 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
21390 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
213a0 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
213b0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
213c0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
213d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
213e0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
213f0 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
21400 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
21410 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
21420 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
21430 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
21440 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
21450 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
21460 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
21470 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
21480 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
21490 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
214a0 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
214b0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
214c0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
214d0 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
214e0 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
214f0 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
21500 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
21510 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c  M clause to 4 sl
21520 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ots..    ** The 
21530 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65  middle slot is e
21540 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
21550 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
21560 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20   make space.    
21570 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65  ** for the two e
21580 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
21590 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
215a0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
215b0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
215c0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
215d0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
215e0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
215f0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
21600 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
21610 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
21620 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21630 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
21640 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21650 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
21660 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
21670 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
21680 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
21690 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
216a0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
216b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
216c0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
216d0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
216e0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
216f0 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
21700 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
21710 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
21720 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
21730 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
21740 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
21750 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
21760 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e  .      iNewParen
21770 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  t = pSubSrc->a[i
21780 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
21790 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
217a0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
217b0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
217c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
217d0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
217e0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
217f0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
21800 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
21810 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
21820 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
21830 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
21840 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
21850 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
21860 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
21870 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
21880 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
21890 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
218a0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
218b0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
218c0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
218d0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
218e0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
218f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
21900 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
21910 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
21920 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
21930 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
21940 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
21950 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
21960 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21970 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
21980 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
21990 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
219a0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
219b0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
219c0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
219d0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
219e0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
219f0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
21a00 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
21a10 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
21a20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
21a30 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
21a40 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
21a50 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
21a60 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
21a70 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
21a80 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
21a90 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
21aa0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
21ab0 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
21ac0 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
21ad0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
21ae0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
21af0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
21b00 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
21b10 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
21b20 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
21b30 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
21b40 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
21b50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
21b60 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
21b70 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
21b80 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
21b90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
21ba0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
21bb0 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
21bc0 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
21bd0 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
21be0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
21bf0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
21c00 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
21c10 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
21c20 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
21c30 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
21c40 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
21c50 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
21c60 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
21c70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
21c80 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
21c90 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
21ca0 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
21cb0 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
21cc0 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
21cd0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
21ce0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
21cf0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
21d00 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
21d10 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
21d20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
21d30 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
21d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21d50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21d60 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
21d70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21d80 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
21d90 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
21da0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
21db0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
21dc0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
21dd0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68  0;.    }.    pWh
21de0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21df0 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
21e00 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69  Where, 0);.    i
21e10 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20  f( isLeftJoin>0 
21e20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
21e30 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65  Expr(pWhere, iNe
21e40 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  wParent);.    }.
21e50 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
21e60 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21e70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c  rAnd(db, pWhere,
21e80 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21e90 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
21ea0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
21eb0 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
21ec0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e  text x;.      x.
21ed0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
21ee0 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
21ef0 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  = iParent;.     
21f00 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
21f10 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
21f20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
21f30 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20  isLeftJoin;.    
21f40 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
21f50 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  b->pEList;.     
21f60 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c   substSelect(&x,
21f70 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20   pParent, 0);.  
21f80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
21f90 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
21fa0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
21fb0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
21fc0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
21fd0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
21fe0 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
21ff0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
22000 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
22010 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
22020 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
22030 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
22040 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
22050 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
22060 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
22070 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
22080 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
22090 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
220a0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
220b0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
220c0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
220d0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
220e0 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
220f0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
22100 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
22110 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
22120 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
22130 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
22140 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
22150 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
22160 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
22170 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
22180 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
22190 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
221a0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
221b0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
221c0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
221d0 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53  , pSub1);..#if S
221e0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
221f0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
22200 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
22210 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
22220 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
22230 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c  rse,p,("After fl
22240 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a  attening:\n"));.
22250 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
22260 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
22270 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
22280 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
22290 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
222a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
222b0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
222c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
222d0 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  IEW) */....#if !
222e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
222f0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
22300 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22310 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
22320 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
22330 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20   relevant WHERE 
22340 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
22350 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22360 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52  into.** the WHER
22370 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  E clause of subq
22380 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  uery.  Example:.
22390 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
223a0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
223b0 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
223c0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78  FROM t1) WHERE x
223d0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
223e0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
223f0 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nto:.**.**    SE
22400 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
22410 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
22420 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  AS y FROM t1 WHE
22430 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31  RE a=5 AND c-d=1
22440 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20  0).**     WHERE 
22450 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
22460 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20  .** The hope is 
22470 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61  that the terms a
22480 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65  dded to the inne
22490 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b  r query will mak
224a0 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66  e it more.** eff
224b0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f  icient..**.** Do
224c0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69   not attempt thi
224d0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
224e0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28  f:.**.**   (1) (
224f0 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74  ** This restrict
22500 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ion was removed 
22510 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20  on 2017-09-29.  
22520 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20  We used to.**   
22530 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77          disallow
22540 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
22550 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  on for aggregate
22560 20 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74   subqueries, but
22570 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
22580 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20    it is allowed 
22590 62 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65  by putting the e
225a0 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
225b0 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
225c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68  .**           Th
225d0 65 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63  e added HAVING c
225e0 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65  lause is pointle
225f0 73 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ss if the subque
22600 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20  ry lacks.**     
22610 20 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59        a GROUP BY
22620 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75   clause.  But su
22630 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  ch a HAVING clau
22640 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c  se is also harml
22650 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ess.**          
22660 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e   so there does n
22670 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20  ot appear to be 
22680 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64  any reason to ad
22690 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a  d extra logic.**
226a0 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75             to su
226b0 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a  ppress it. **).*
226c0 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69  *.**   (2) The i
226d0 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68  nner query is th
226e0 65 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74  e recursive part
226f0 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62   of a common tab
22700 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
22710 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69  *.**   (3) The i
22720 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61  nner query has a
22730 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73   LIMIT clause (s
22740 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73  ince the changes
22750 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a   to the WHERE.**
22760 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75         close wou
22770 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65  ld change the me
22780 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d  aning of the LIM
22790 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  IT)..**.**   (4)
227a0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
227b0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
227c0 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
227d0 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c  JOIN.  (The call
227e0 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f  er.**       enfo
227f0 72 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69  rces this restri
22800 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73  ction since this
22810 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
22820 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a  t have enough.**
22830 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69         informati
22840 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a  on to know.).**.
22850 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45  **   (5) The WHE
22860 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
22870 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20  sion originates 
22880 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
22890 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  NG clause.**    
228a0 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49     of a LEFT JOI
228b0 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  N..**.** Return 
228c0 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  0 if no changes 
228d0 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e  are made and non
228e0 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20  -zero if one or 
228f0 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73  more WHERE claus
22900 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64  e.** terms are d
22910 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74  uplicated into t
22920 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
22930 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44  static int pushD
22940 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20  ownWhereTerms(. 
22950 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
22960 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
22970 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c  context (for mal
22980 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20  loc() and error 
22990 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20  reporting) */.  
229a0 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20  Select *pSubq,  
229b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
229c0 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52  query whose WHER
229d0 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62  E clause is to b
229e0 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20  e augmented */. 
229f0 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
22a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
22a10 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
22a20 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
22a30 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20  .  int iCursor  
22a40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
22a50 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
22a60 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a   subquery */.){.
22a70 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
22a80 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20  int nChng = 0;. 
22a90 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
22aa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22ab0 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
22ac0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
22ad0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
22ae0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20  restriction (2) 
22af0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
22b00 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c  E_DEBUG.  /* Onl
22b10 79 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  y the first term
22b20 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63   of a compound c
22b30 61 6e 20 68 61 76 65 20 61 20 57 49 54 48 20 63  an have a WITH c
22b40 6c 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65  lause.  But make
22b50 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74  .  ** sure no ot
22b60 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61  her terms are ma
22b70 72 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69 76  rked SF_Recursiv
22b80 65 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68  e in case someth
22b90 69 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ing changes.  **
22ba0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
22bb0 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c    */.  {.    Sel
22bc0 65 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66  ect *pX;  .    f
22bd0 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b  or(pX=pSubq; pX;
22be0 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
22bf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
22c00 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  pX->selFlags & (
22c10 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d  SF_Recursive))==
22c20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  0 );.    }.  }.#
22c30 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75  endif..  if( pSu
22c40 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b  bq->pLimit!=0 ){
22c50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
22c60 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  * restriction (3
22c70 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ) */.  }.  while
22c80 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b  ( pWhere->op==TK
22c90 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e  _AND ){.    nChn
22ca0 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65  g += pushDownWhe
22cb0 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
22cc0 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70  pSubq, pWhere->p
22cd0 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b  Right, iCursor);
22ce0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
22cf0 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d  here->pLeft;.  }
22d00 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
22d10 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50  operty(pWhere,EP
22d20 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
22d30 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
22d40 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 69  ction (5) */.  i
22d50 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
22d60 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57  TableConstant(pW
22d70 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29  here, iCursor) )
22d80 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20  {.    nChng++;. 
22d90 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20     while( pSubq 
22da0 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
22db0 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70  ntext x;.      p
22dc0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
22dd0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
22de0 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
22df0 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
22e00 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
22e10 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
22e20 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
22e30 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
22e40 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
22e50 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
22e60 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
22e70 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
22e80 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
22e90 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
22ea0 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
22eb0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
22ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  ){.        pSubq
22ed0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
22ee0 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
22ef0 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48  e->db, pSubq->pH
22f00 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20  aving, pNew);.  
22f10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22f20 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
22f30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
22f40 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
22f50 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
22f60 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
22f70 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
22f80 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
22f90 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
22fa0 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
22fb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22fc0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
22fd0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
22fe0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
22ff0 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20  /*.** The pFunc 
23000 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72  is the only aggr
23010 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
23020 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20 43 68  n the query.  Ch
23030 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  eck to see.** if
23040 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
23050 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
23060 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
23070 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  zation. .**.** I
23080 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
23090 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
230a0 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
230b0 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ization, then se
230c0 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74  t.** *ppMinMax t
230d0 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59  o be an ORDER BY
230e0 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
230f0 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d  ed for the optim
23100 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  ization.** and r
23110 65 74 75 72 6e 20 65 69 74 68 65 72 20 57 48 45  eturn either WHE
23120 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
23130 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
23140 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  MAX depending on
23150 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e  .** whether pFun
23160 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  c is a min() or 
23170 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  max() function..
23180 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
23190 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64  ry is not a cand
231a0 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
231b0 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
231c0 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48  on, return.** WH
231d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
231e0 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  AL (which must b
231f0 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54  e zero)..**.** T
23200 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
23210 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
23220 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
23230 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a  ions have been.*
23240 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65  * located but be
23250 66 6f 72 65 20 74 68 65 69 72 20 61 72 67 75 6d  fore their argum
23260 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 73  ents have been s
23270 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72  ubjected to aggr
23280 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69  egate.** analysi
23290 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
232a0 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69  minMaxQuery(sqli
232b0 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
232c0 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a  Func, ExprList *
232d0 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
232e0 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
232f0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
23300 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
23310 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  lue */.  ExprLis
23320 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e  t *pEList = pFun
23330 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f  c->x.pList;    /
23340 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
23350 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  gg function */. 
23360 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
23370 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
23380 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
23390 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
233a0 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20  tion pFunc */.  
233b0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
233c0 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64  By;.  u8 sortOrd
233d0 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  er;..  assert( *
233e0 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20  ppMinMax==0 );. 
233f0 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
23400 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
23410 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  ION );.  if( pEL
23420 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
23430 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
23440 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e  urn eRet;.  zFun
23450 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f  c = pFunc->u.zTo
23460 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ken;.  if( sqlit
23470 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
23480 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
23490 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
234a0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
234b0 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
234c0 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c  TE_SO_ASC;.  }el
234d0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
234e0 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
234f0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  x")==0 ){.    eR
23500 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
23510 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74  BY_MAX;.    sort
23520 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
23530 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b  O_DESC;.  }else{
23540 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65 74  .    return eRet
23550 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61  ;.  }.  *ppMinMa
23560 78 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  x = pOrderBy = s
23570 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
23580 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
23590 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
235a0 65 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  erBy!=0 || db->m
235b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
235c0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
235d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
235e0 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f  ortOrder = sortO
235f0 72 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65  rder;.  return e
23600 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
23610 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
23620 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
23630 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
23640 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
23650 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
23660 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
23670 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
23680 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
23690 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
236a0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
236b0 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
236c0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
236d0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
236e0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
236f0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
23700 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
23710 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
23720 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
23730 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
23740 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
23750 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
23760 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
23770 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
23780 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
23790 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
237a0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
237b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
237c0 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
237d0 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
237e0 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
237f0 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
23800 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
23810 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
23820 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
23830 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
23840 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
23850 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
23860 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
23870 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
23880 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
23890 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
238a0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
238b0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
238c0 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
238d0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
238e0 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
238f0 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
23900 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
23910 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
23920 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
23930 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
23940 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
23950 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23960 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
23970 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
23980 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
23990 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
239a0 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
239b0 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
239c0 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
239d0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
239e0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
239f0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
23a00 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
23a10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
23a20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
23a30 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
23a40 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
23a50 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
23a60 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
23a70 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
23a80 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
23a90 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
23aa0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
23ab0 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
23ac0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
23ad0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
23ae0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
23af0 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
23b00 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
23b10 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
23b20 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
23b30 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
23b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
23b50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
23b60 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
23b70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
23b80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23b90 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
23ba0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
23bb0 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
23bc0 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
23bd0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
23be0 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
23bf0 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
23c00 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
23c10 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
23c20 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
23c30 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
23c40 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
23c50 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
23c60 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
23c70 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
23c80 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
23c90 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
23ca0 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
23cb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23cc0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
23cd0 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
23ce0 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
23cf0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
23d00 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
23d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23d20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
23d30 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
23d40 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
23d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23d60 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
23d70 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
23d80 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
23d90 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
23da0 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
23db0 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
23dc0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23dd0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
23de0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
23df0 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
23e00 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
23e10 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
23e20 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
23e30 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
23e40 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
23e50 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
23e60 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
23e70 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
23e80 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
23e90 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
23ea0 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
23eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
23ec0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
23ed0 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
23ee0 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
23ef0 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
23f00 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
23f10 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
23f20 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
23f30 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
23f40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23f50 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
23f60 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
23f70 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
23f80 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
23f90 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
23fa0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
23fb0 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
23fc0 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
23fd0 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
23fe0 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
23ff0 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
24000 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
24010 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
24020 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
24030 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
24040 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
24050 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
24060 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
24070 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
24080 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
24090 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
240a0 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
240b0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
240c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
240d0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
240e0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
240f0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24100 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
24110 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
24120 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
24130 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
24140 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
24150 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
24160 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
24170 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
24180 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
24190 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
241a0 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
241b0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
241c0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
241d0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
241e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
241f0 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
24200 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
24210 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
24220 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
24230 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
24240 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
24250 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
24260 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
24270 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
24280 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
24290 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
242a0 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
242b0 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
242c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
242d0 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
242e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
242f0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
24300 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
24310 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
24320 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
24330 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
24340 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24350 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
24360 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
24370 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
24380 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
24390 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
243a0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
243b0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
243c0 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
243d0 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
243e0 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
243f0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
24400 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
24410 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
24420 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
24430 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
24440 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
24450 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
24460 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
24470 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
24480 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
24490 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
244a0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
244b0 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
244c0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
244d0 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
244e0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
244f0 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
24500 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
24510 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
24520 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
24530 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
24540 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
24550 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
24560 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
24570 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
24580 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
24590 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
245a0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
245b0 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
245c0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
245d0 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
245e0 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
245f0 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
24600 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
24610 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
24620 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
24630 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
24640 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
24650 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73  e term pFrom has
24660 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
24670 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65  nction.** argume
24680 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  nts.  If it does
24690 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
246a0 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
246b0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  se and return.**
246c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65   non-zero, since
246d0 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c   pFrom is not al
246e0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61  lowed to be a ta
246f0 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
24700 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
24710 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  nt cannotBeFunct
24720 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
24730 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
24740 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
24750 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
24760 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
24770 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
24780 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69  (pParse, "'%s' i
24790 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
247a0 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29  ", pFrom->zName)
247b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
247c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
247d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
247e0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
247f0 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
24800 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
24810 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
24820 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
24830 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
24840 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
24850 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
24860 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
24870 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
24880 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
24890 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
248a0 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
248b0 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
248c0 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
248d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
248e0 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
248f0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
24900 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
24910 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
24920 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
24930 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
24940 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
24950 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
24960 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
24970 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
24980 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
24990 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
249a0 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
249b0 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
249c0 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
249d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
249e0 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57  rent innermost W
249f0 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
24a00 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24a10 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
24a20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
24a30 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
24a40 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
24a50 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
24a60 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
24a70 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
24a80 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
24a90 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
24aa0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
24ab0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
24ac0 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
24ad0 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
24ae0 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
24af0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
24b00 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
24b10 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
24b20 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
24b30 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
24b40 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
24b50 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
24b60 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
24b70 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
24b80 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
24b90 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
24ba0 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
24bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24bc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
24bd0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
24be0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
24bf0 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
24c00 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
24c10 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
24c20 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
24c30 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
24c40 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
24c50 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
24c60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
24c70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
24c80 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
24c90 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
24ca0 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
24cb0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
24cc0 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
24cd0 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
24ce0 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
24cf0 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
24d00 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
24d10 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
24d20 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
24d30 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
24d40 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
24d50 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
24d60 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
24d70 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
24d80 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
24d90 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
24da0 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
24db0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
24dc0 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
24dd0 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
24de0 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
24df0 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
24e00 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
24e10 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
24e20 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
24e30 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d   (pParse->pWith=
24e40 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57  =0 && pParse->pW
24e50 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b  ithToFree==0) );
24e60 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
24e70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
24e80 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68  se->pWith!=pWith
24e90 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   );.    pWith->p
24ea0 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
24eb0 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
24ec0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
24ed0 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20  ;.    if( bFree 
24ee0 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  ) pParse->pWithT
24ef0 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20  oFree = pWith;. 
24f00 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
24f10 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
24f20 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
24f30 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
24f40 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
24f50 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
24f60 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
24f70 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
24f80 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
24f90 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
24fa0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
24fb0 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
24fc0 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
24fd0 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
24fe0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
24ff0 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
25000 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
25010 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
25020 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
25030 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
25040 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
25050 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
25060 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
25070 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
25080 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
25090 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
250a0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
250b0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
250c0 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
250d0 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
250e0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
250f0 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
25100 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
25110 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
25120 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
25130 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
25140 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
25150 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
25160 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
25170 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
25180 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
25190 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
251a0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
251b0 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
251c0 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
251d0 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
251e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
251f0 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
25200 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
25210 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
25220 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
25230 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
25240 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
25250 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
25260 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
25270 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
25280 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
252b0 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
252c0 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
252d0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
252e0 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
252f0 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
25300 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
25310 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
25320 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
25330 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
25340 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
25350 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
25360 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
25370 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25380 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
25390 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
253a0 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
253b0 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
253c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
253d0 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
253e0 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
253f0 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
25400 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
25410 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
25420 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
25430 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
25440 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
25450 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
25460 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
25470 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
25480 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
25490 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
254a0 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
254b0 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
254c0 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
254d0 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
254e0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
254f0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
25500 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
25510 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
25520 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
25530 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
25540 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
25550 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20  zCteErr ){.     
25560 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25570 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
25580 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  CteErr, pCte->zN
25590 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
255a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
255b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
255c0 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
255d0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
255e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
255f0 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72  RROR;..    asser
25600 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
25610 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
25620 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
25630 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
25640 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
25650 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
25660 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
25670 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
25680 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
25690 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
256a0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
256b0 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
256c0 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
256d0 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
256e0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
256f0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
25700 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
25710 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
25720 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
25730 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
25740 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
25750 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  owid;.    pFrom-
25760 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
25770 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
25780 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
25790 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
257a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
257b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
257c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  M_BKPT;.    asse
257d0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
257e0 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  ct );..    /* Ch
257f0 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
25800 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20   recursive CTE. 
25810 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46  */.    pSel = pF
25820 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
25830 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20    bMayRecursive 
25840 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b  = ( pSel->op==TK
25850 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70  _ALL || pSel->op
25860 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
25870 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
25880 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
25890 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73   i;.      SrcLis
258a0 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d  t *pSrc = pFrom-
258b0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
258c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
258d0 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
258e0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
258f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
25900 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
25910 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
25920 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
25930 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e==0 .         &
25940 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  & pItem->zName!=
25950 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  0 .         && 0
25960 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
25970 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
25980 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20  Cte->zName).    
25990 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
259a0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d     pItem->pTab =
259b0 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
259c0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63   pItem->fg.isRec
259d0 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
259e0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
259f0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
25a00 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
25a10 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
25a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25a40 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
25a50 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
25a60 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
25a70 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
25a80 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  abRef>2 ){.     
25a90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25aa0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
25ab0 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
25ac0 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
25ad0 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
25ae0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
25af0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
25b00 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
25b10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
25b20 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  rt( pTab->nTabRe
25b30 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20  f==1 || .       
25b40 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c       ((pSel->sel
25b50 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
25b60 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61  ve) && pTab->nTa
25b70 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  bRef==2 ));..   
25b80 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25b90 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
25ba0 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
25bb0 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
25bc0 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
25bd0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
25be0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d  With;.    if( bM
25bf0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
25c00 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72       Select *pPr
25c10 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  ior = pSel->pPri
25c20 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
25c30 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d  ( pPrior->pWith=
25c40 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  =0 );.      pPri
25c50 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c  or->pWith = pSel
25c60 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73  ->pWith;.      s
25c70 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25c80 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72  (pWalker, pPrior
25c90 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
25ca0 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20  >pWith = 0;.    
25cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25cc0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
25cd0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
25ce0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
25cf0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
25d00 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
25d10 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
25d20 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
25d30 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
25d40 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
25d50 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
25d60 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
25d70 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
25d80 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
25d90 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
25da0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
25db0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25dc0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
25dd0 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
25de0 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
25df0 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
25e00 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
25e10 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
25e20 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
25e30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
25e40 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
25e50 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
25e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25e70 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
25e80 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
25e90 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
25ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
25eb0 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
25ec0 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
25ed0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
25ee0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
25ef0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
25f00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
25f10 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
25f20 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
25f30 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
25f40 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
25f50 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
25f60 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
25f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25f80 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25f90 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
25fa0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
25fb0 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
25fc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
25fd0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25fe0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
25ff0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
26000 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
26010 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
26020 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
26030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26040 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
26050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
26060 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
26070 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
26080 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26090 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
260a0 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
260b0 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
260c0 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
260d0 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
260e0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
260f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
26100 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
26110 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
26120 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
26130 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
26140 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
26150 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
26160 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
26170 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
26180 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
26190 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
261a0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
261b0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
261c0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
261d0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
261e0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
261f0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
26200 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59   if( OK_IF_ALWAY
26210 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70  S_TRUE(pParse->p
26220 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69  With) && p->pPri
26230 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  or==0 ){.    Wit
26240 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
26250 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
26260 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74  th;.    if( pWit
26270 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  h!=0 ){.      as
26280 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
26290 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
262a0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
262b0 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
262c0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  r;.    }.  }.}.#
262d0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
262e0 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
262f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
26300 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
26310 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
26320 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
26330 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
26340 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
26350 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
26360 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
26370 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
26380 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
26390 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
263a0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
263b0 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
263c0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
263d0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
263e0 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
263f0 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
26400 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
26410 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
26420 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
26430 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
26440 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
26450 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
26460 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
26470 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
26480 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
26490 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
264a0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
264b0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
264c0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
264d0 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
264e0 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
264f0 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
26500 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
26510 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
26520 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
26530 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
26540 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
26550 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
26560 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
26570 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73  ng up the persis
26580 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
26590 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
265a0 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
265b0 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
265c0 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
265d0 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
265e0 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52  modate the NATUR
265f0 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20  AL keyword.**   
26600 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61        on joins a
26610 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  nd the ON and US
26620 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f  ING clause of jo
26630 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34  ins..**.**    (4
26640 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74  )  Scan the list
26650 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
26660 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70  he result set (p
26670 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a  EList) looking.*
26680 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e  *         for in
26690 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22  stances of the "
266a0 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74  *" operator or t
266b0 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61  he TABLE.* opera
266c0 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tor..**         
266d0 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64  If found, expand
266e0 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20   each "*" to be 
266f0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
26700 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20  every table.**  
26710 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45         and TABLE
26720 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63  .* to be every c
26730 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a  olumn in TABLE..
26740 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
26750 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
26760 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
26770 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
26780 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
26790 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
267a0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
267b0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
267c0 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  st;.  ExprList *
267d0 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
267e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
267f0 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  From;.  sqlite3 
26800 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
26810 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70  ;.  Expr *pE, *p
26820 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20  Right, *pExpr;. 
26830 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20   u16 selFlags = 
26840 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 20 20 75  p->selFlags;.  u
26850 33 32 20 65 6c 69 73 74 46 6c 61 67 73 20 3d 20  32 elistFlags = 
26860 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  0;..  p->selFlag
26870 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
26880 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
26890 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
268a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
268b0 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
268c0 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20   p->pSrc!=0 );. 
268d0 20 69 66 28 20 28 73 65 6c 46 6c 61 67 73 20 26   if( (selFlags &
268e0 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30   SF_Expanded)!=0
268f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
26900 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
26910 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
26920 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
26930 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
26940 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55  OK_IF_ALWAYS_TRU
26950 45 28 70 2d 3e 70 57 69 74 68 29 20 29 7b 0a 20  E(p->pWith) ){. 
26960 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75     sqlite3WithPu
26970 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57  sh(pParse, p->pW
26980 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  ith, 0);.  }..  
26990 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
269a0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
269b0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
269c0 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
269d0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
269e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
269f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
26a00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
26a10 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
26a20 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
26a30 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
26a40 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
26a50 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
26a60 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
26a70 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
26a80 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
26a90 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
26aa0 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
26ab0 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
26ac0 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
26ad0 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
26ae0 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
26af0 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
26b00 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
26b10 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
26b20 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
26b30 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
26b40 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
26b50 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
26b60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
26b70 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
26b80 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
26b90 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20  >pTab!=0 );.    
26ba0 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
26bb0 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
26bc0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
26bd0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
26be0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
26bf0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
26c00 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
26c10 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
26c20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26c30 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
26c40 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
26c50 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
26c60 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
26c70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
26c80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
26c90 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
26ca0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
26cb0 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
26cc0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
26cd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
26ce0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
26cf0 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
26d00 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
26d10 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26d20 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
26d30 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
26d40 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
26d50 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
26d60 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  rt;.      pFrom-
26d70 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
26d80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
26d90 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
26da0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
26db0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
26dc0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26dd0 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
26de0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
26df0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pFrom->zAlias ){
26e00 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
26e10 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
26e20 53 74 72 44 75 70 28 64 62 2c 20 70 46 72 6f 6d  StrDup(db, pFrom
26e30 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
26e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26e50 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
26e60 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
26e70 20 22 73 75 62 71 75 65 72 79 5f 25 70 22 2c 20   "subquery_%p", 
26e80 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
26e90 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
26ea0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
26eb0 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
26ec0 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
26ed0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
26ee0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
26ef0 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
26f00 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61  &pTab->nCol,&pTa
26f10 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
26f20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
26f30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
26f40 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
26f50 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
26f60 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
26f70 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  76) );.      pTa
26f80 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
26f90 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
26fa0 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
26fb0 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
26fc0 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
26fd0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
26fe0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
26ff0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
27000 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
27010 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
27020 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
27030 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
27040 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
27050 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
27060 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
27070 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
27080 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
27090 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
270a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
270b0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
270c0 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
270d0 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
270e0 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
270f0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
27100 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
27110 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
27120 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27130 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
27140 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b   pTab->nTabRef++
27150 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 56  ;.      if( !IsV
27160 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
27170 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
27180 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
27190 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
271a0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
271b0 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65     }.#if !define
271c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
271d0 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
271e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
271f0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
27200 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
27210 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53  Tab) || pTab->pS
27220 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
27230 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   i16 nCol;.     
27240 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
27250 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
27260 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
27270 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27280 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
27290 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
272a0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
272b0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
272c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
272d0 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
272e0 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
272f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
27300 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65  tName(pFrom->pSe
27310 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lect, pTab->zNam
27320 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  e);.        nCol
27330 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
27340 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
27350 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
27360 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
27370 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d  t(pWalker, pFrom
27380 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
27390 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
273a0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23   nCol;.      }.#
273b0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
273c0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
273d0 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
273e0 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
273f0 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
27400 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
27410 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
27420 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
27430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
27440 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
27450 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
27460 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
27470 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
27480 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
27490 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
274a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
274b0 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
274c0 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
274d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
274e0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
274f0 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
27500 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
27510 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
27520 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
27530 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
27540 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
27550 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
27560 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
27570 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
27580 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
27590 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
275a0 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
275b0 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
275c0 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
275d0 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b   the TK_ASTERISK
275e0 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61   operator for ea
275f0 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20 66  ch "*" that it f
27600 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75  ound in the colu
27610 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54  mn.  ** list.  T
27620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
27630 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f  e just has to lo
27640 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45  cate the TK_ASTE
27650 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73  RISK.  ** expres
27660 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
27670 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
27680 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
27690 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c  umns in.  ** all
276a0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
276b0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
276c0 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
276d0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
276e0 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
276f0 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
27700 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
27710 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
27720 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
27730 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
27740 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
27750 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
27760 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
27770 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
27780 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
27790 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21  T || pE->pRight!
277a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
277b0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
277c0 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d   || (pE->pLeft!=
277d0 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  0 && pE->pLeft->
277e0 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20  op==TK_ID) );.  
277f0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
27800 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67  _DOT && pE->pRig
27810 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  ht->op==TK_ASTER
27820 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
27830 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70   elistFlags |= p
27840 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20  E->flags;.  }.  
27850 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
27860 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
27870 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
27880 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
27890 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
278a0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
278b0 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
278c0 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
278d0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
278e0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
278f0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
27900 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
27910 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
27920 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
27930 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
27940 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
27950 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
27960 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
27970 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
27980 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
27990 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
279a0 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
279b0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
279c0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
279d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
279e0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
279f0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
27a00 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
27a10 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
27a20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
27a30 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
27a40 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
27a50 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20 70   elistFlags |= p
27a60 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  E->flags;.      
27a70 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69  pRight = pE->pRi
27a80 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
27a90 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
27aa0 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29  T || pRight!=0 )
27ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
27ac0 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a  op!=TK_ASTERISK.
27ad0 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f         && (pE->o
27ae0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
27af0 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45  ght->op!=TK_ASTE
27b00 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20  RISK).      ){. 
27b10 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
27b20 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
27b30 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
27b40 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
27b50 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
27b60 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
27b70 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
27b80 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
27b90 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
27ba0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
27bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
27bc0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
27bd0 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
27be0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
27bf0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
27c00 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
27c10 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
27c20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
27c30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27c40 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
27c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27c60 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
27c70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27c80 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
27c90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
27ca0 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
27cb0 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
27cc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
27cd0 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
27ce0 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
27cf0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
27d00 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
27d10 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
27d20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
27d30 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
27d40 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
27d50 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
27d60 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
27d70 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
27d80 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
27d90 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
27da0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
27db0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
27dc0 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
27dd0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
27de0 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
27df0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
27e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27e10 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
27e20 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
27e30 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
27e40 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
27e50 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
27e60 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
27e70 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
27e80 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
27e90 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
27ea0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
27eb0 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
27ec0 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
27ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
27ee0 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
27ef0 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
27f00 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
27f10 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
27f20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
27f30 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
27f40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27f50 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
27f60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
27f70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
27f80 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
27f90 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
27fa0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
27fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27fc0 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
27fd0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
27fe0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
27ff0 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
28000 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
28010 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
28020 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
28030 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
28040 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
28050 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
28060 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
28070 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
28080 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
28090 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
280a0 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20  Name : "*";.    
280b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
280c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
280d0 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
280e0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
280f0 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
28100 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
28110 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
28120 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
28130 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
28140 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
28150 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
28160 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
28170 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
28180 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
28190 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
281a0 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
281b0 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
281c0 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
281d0 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
281e0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d      assert( zNam
281f0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
28200 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70   if( zTName && p
28210 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  Sub.            
28220 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68   && sqlite3Match
28230 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70  SpanName(pSub->p
28240 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61  EList->a[j].zSpa
28250 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29  n, 0, zTName, 0)
28260 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
28270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28280 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
28290 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
282a0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f        /* If a co
282b0 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61  lumn is marked a
282c0 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74  s 'hidden', omit
282d0 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70   it from the exp
282e0 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
282f0 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
28300 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20  list unless the 
28310 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53  SELECT has the S
28320 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a  F_IncludeHidden.
28330 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
28340 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20  it set..        
28350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
28360 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c     if( (p->selFl
28370 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65  ags & SF_Include
28380 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20  Hidden)==0.     
28390 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64          && IsHid
283a0 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
283b0 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20  >aCol[j]) .     
283c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
283d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
283e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
283f0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
28400 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20  eSeen = 1;..    
28410 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
28420 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28440 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69  ( (pFrom->fg.joi
28450 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
28460 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
28470 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
28480 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
28490 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
284a0 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
284b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
284c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
284d0 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
284e0 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
284f0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
28510 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
28520 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
28530 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28540 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
28550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28560 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28570 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
28580 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
28590 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
285b0 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
285c0 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
285d0 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
285e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
285f0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
28600 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
28610 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
28620 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
28630 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28650 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28660 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
28670 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
28680 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
28690 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
286a0 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
286b0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
286c0 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
286d0 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
286e0 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
286f0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
28700 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
28710 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
28720 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
28730 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
28740 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
28750 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28760 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
28770 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
28780 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
287a0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
287d0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
287e0 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
28800 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
28810 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
28820 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b  , pLeft, pExpr);
28830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
28840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
28850 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
28880 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
28890 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
288a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
288b0 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
288c0 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
288d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
288e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
28900 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
28910 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28920 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
28930 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
28940 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
28950 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
28960 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f         sqlite3To
28970 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d  kenInit(&sColnam
28980 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
28990 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
289a0 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
289b0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
289c0 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
289d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
289e0 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  ew && (p->selFla
289f0 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
28a00 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
28a10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
28a20 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58  xprList_item *pX
28a30 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77   = &pNew->a[pNew
28a40 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
28a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
28a60 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
28a70 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
28a80 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
28a90 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69  p(db, pSub->pELi
28aa0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b  st->a[j].zSpan);
28ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28ac0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
28ad0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
28ae0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
28b10 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
28b20 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20  %s.%s.%s",.     
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
28b60 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f  e, zTabName, zCo
28b70 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
28b80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28b90 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
28ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28bb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
28bc0 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  pX->bSpanIsTab =
28bd0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
28be0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
28bf0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
28c00 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  zToFree);.      
28c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28c20 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62          if( !tab
28c30 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20  leSeen ){.      
28c40 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29      if( zTName )
28c50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
28c60 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28c70 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74  arse, "no such t
28c80 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d  able: %s", zTNam
28c90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
28ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28cb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28cc0 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62  (pParse, "no tab
28cd0 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b  les specified");
28ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28d00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
28d10 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
28d20 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b, pEList);.    
28d30 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77  p->pEList = pNew
28d40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
28d50 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  EList ){.    if(
28d60 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
28d70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
28d80 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
28d90 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
28da0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28db0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
28dc0 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
28dd0 65 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  et");.      retu
28de0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28df0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c 69    }.    if( (eli
28e00 73 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48 61  stFlags & (EP_Ha
28e10 73 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65 72  sFunc|EP_Subquer
28e20 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  y))!=0 ){.      
28e30 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
28e40 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b  F_ComplexResult;
28e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28e60 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
28e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
28e80 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
28e90 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
28ea0 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
28eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
28ec0 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
28ed0 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
28ee0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
28ef0 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
28f00 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
28f10 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
28f20 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
28f30 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
28f40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
28f50 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
28f60 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
28f70 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
28f80 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
28f90 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
28fa0 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
28fb0 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
28fc0 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
28fd0 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tree..*/.int sql
28fe0 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
28ff0 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
29000 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
29010 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
29020 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
29030 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
29040 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
29050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
29060 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
29070 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
29080 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  er for SELECT st
29090 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62  atements..** sub
290a0 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
290b0 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
290c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
290d0 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
290e0 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a  otUsed, Select *
290f0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
29100 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
29110 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
29120 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
29130 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66  Continue;.}..#if
29140 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
29150 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72  .** Always asser
29160 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74  t.  This xSelect
29170 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d  Callback2 implem
29180 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20  entation proves 
29190 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c  that the.** xSel
291a0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20  ectCallback2 is 
291b0 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a  never invoked..*
291c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
291d0 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28  lectWalkAssert2(
291e0 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
291f0 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
29200 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
29210 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
29220 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73   NotUsed2);.  as
29230 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e  sert( 0 );.}.#en
29240 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  dif./*.** This r
29250 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
29260 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
29270 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
29280 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
29290 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
292a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
292b0 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
292c0 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
292d0 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
292e0 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
292f0 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
29300 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
29310 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
29320 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
29330 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
29340 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
29350 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
29360 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
29370 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
29380 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
29390 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
293a0 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
293b0 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
293c0 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
293d0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
293e0 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
293f0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
29400 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
29410 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
29420 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
29430 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
29440 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
29450 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
29460 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
29470 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
29480 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
29490 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
294a0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
294b0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
294c0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45  Walker w;.  w.xE
294d0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
294e0 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
294f0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
29500 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b  pParse;.  if( OK
29510 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28  _IF_ALWAYS_TRUE(
29520 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
29530 75 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78 53  und) ){.    w.xS
29540 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
29550 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
29560 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
29570 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
29580 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20  llback2 = 0;.   
29590 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
295a0 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
295b0 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
295c0 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
295d0 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
295e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
295f0 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
29600 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
29610 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
29620 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
29630 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
29640 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
29650 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
29660 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
29670 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
29680 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
29690 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
296a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
296b0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
296c0 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
296d0 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
296e0 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
296f0 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
29700 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
29710 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
29720 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
29730 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
29740 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
29750 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
29760 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
29770 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
29780 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
29790 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
297a0 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
297b0 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
297c0 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
297d0 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
297e0 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
297f0 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
29800 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
29810 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
29820 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
29830 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
29840 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
29850 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
29860 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
29870 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
29880 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
29890 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
298a0 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
298b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
298c0 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
298d0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
298e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
298f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
29900 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72  olved );.  asser
29910 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
29920 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
29930 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
29940 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
29950 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73  ypeInfo;.  pPars
29960 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
29970 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rse;.  pTabList 
29980 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72  = p->pSrc;.  for
29990 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
299a0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
299b0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
299c0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
299d0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
299e0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
299f0 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
29a00 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
29a10 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
29a20 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
29a30 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
29a40 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
29a50 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
29a60 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  T */.      Selec
29a70 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
29a80 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
29a90 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
29aa0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
29ab0 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
29ac0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
29ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
29ae0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
29af0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
29b00 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
29b10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29b20 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
29b30 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
29b40 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
29b50 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
29b60 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
29b70 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
29b80 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
29b90 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
29ba0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
29bb0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
29bc0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
29bd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
29be0 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
29bf0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
29c00 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
29c10 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
29c20 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
29c30 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
29c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29c50 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
29c60 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
29c70 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ctCallback = sql
29c80 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f  ite3SelectWalkNo
29c90 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  op;.  w.xSelectC
29ca0 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
29cb0 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
29cc0 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43  Info;.  w.xExprC
29cd0 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
29ce0 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
29cf0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
29d00 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
29d10 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
29d20 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
29d30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
29d40 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
29d50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
29d60 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
29d70 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
29d80 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
29d90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
29da0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
29db0 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
29dc0 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
29dd0 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
29de0 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
29df0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
29e00 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
29e10 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
29e20 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
29e30 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
29e40 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
29e50 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
29e60 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
29e70 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
29e80 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
29e90 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
29ea0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
29eb0 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
29ec0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
29ed0 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
29ee0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
29ef0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
29f00 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
29f10 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
29f20 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
29f30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
29f40 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
29f50 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
29f60 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
29f70 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
29f80 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
29f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
29fa0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
29fb0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
29fc0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
29fd0 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
29fe0 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
29ff0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  iner */.){.  ass
2a000 65 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50 61  ert( p!=0 || pPa
2a010 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
2a020 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
2a030 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2a040 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2a050 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
2a060 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
2a070 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
2a080 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2a090 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
2a0a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
2a0b0 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
2a0c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a0d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
2a0e0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
2a0f0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
2a100 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
2a110 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2a120 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
2a130 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2a140 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
2a150 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
2a160 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
2a170 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
2a180 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2a190 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
2a1a0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2a1b0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
2a1c0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
2a1d0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
2a1e0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
2a1f0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
2a200 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
2a210 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
2a220 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
2a230 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
2a240 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
2a250 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
2a260 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
2a270 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
2a280 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
2a290 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
2a2a0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
2a2b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2a2c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
2a2d0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
2a2e0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
2a2f0 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
2a300 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
2a310 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
2a320 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
2a330 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
2a340 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
2a350 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
2a360 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
2a370 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
2a380 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
2a390 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
2a3a0 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
2a3b0 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
2a3c0 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
2a3d0 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
2a3e0 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
2a3f0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2a400 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
2a410 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2a420 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
2a430 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
2a440 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
2a450 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
2a460 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
2a470 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
2a480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
2a490 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2a4a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a4b0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2a4c0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
2a4d0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
2a4e0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
2a4f0 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
2a500 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
2a510 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
2a520 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2a530 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
2a540 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
2a550 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
2a560 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
2a570 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
2a580 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2a590 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
2a5a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
2a5b0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
2a5c0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
2a5d0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
2a5e0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2a5f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2a600 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
2a610 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
2a620 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
2a630 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
2a640 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
2a650 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2a660 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
2a670 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
2a680 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
2a690 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
2a6a0 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
2a6b0 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
2a6c0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
2a6d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a6e0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2a6f0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
2a700 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2a710 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
2a720 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
2a730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a740 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2a750 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69  emeral, pFunc->i
2a760 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a  Distinct, 0, 0,.
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a780 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2a790 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2a7a0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
2a7b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2a7c0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50  ** Invoke the OP
2a7d0 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63  _AggFinalize opc
2a7e0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67  ode for every ag
2a7f0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2a800 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e  .** in the AggIn
2a810 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  fo structure..*/
2a820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e  .static void fin
2a830 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
2a840 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
2a850 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
2a860 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
2a870 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
2a880 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
2a890 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2a8a0 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  pF;.  for(i=0, p
2a8b0 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
2a8c0 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
2a8d0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
2a8e0 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
2a8f0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
2a900 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
2a910 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2a920 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
2a930 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2a940 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
2a950 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a960 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
2a970 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
2a980 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  st->nExpr : 0);.
2a990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a9a0 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70  ppendP4(v, pF->p
2a9b0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
2a9c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a9d0 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
2a9e0 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
2a9f0 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
2aa00 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
2aa10 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
2aa20 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
2aa30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
2aa40 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
2aa50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2aa60 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2aa70 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2aa80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2aa90 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48  nt i;.  int regH
2aaa0 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64  it = 0;.  int ad
2aab0 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20  drHitTest = 0;. 
2aac0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2aad0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75  func *pF;.  stru
2aae0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2aaf0 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d  pC;..  pAggInfo-
2ab00 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  >directMode = 1;
2ab10 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
2ab20 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
2ab30 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2ab40 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
2ab50 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20     int nArg;.   
2ab60 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20   int addrNext = 
2ab70 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67  0;.    int regAg
2ab80 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  g;.    ExprList 
2ab90 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
2aba0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
2abb0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2abc0 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45  sProperty(pF->pE
2abd0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
2abe0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
2abf0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
2ac00 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
2ac10 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2ac20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2ac30 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
2ac40 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
2ac50 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2ac60 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
2ac70 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49   regAgg, 0, SQLI
2ac80 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20  TE_ECEL_DUP);.  
2ac90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
2aca0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
2acb0 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
2acc0 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
2acd0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
2ace0 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
2acf0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2ad00 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
2ad10 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29  tcase( nArg==0 )
2ad20 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64  ;  /* Error cond
2ad30 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74  ition */.      t
2ad40 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20  estcase( nArg>1 
2ad50 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20  );   /* Also an 
2ad60 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63  error */.      c
2ad70 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
2ad80 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
2ad90 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
2ada0 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
2adb0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
2adc0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
2add0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
2ade0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
2adf0 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
2ae00 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
2ae10 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
2ae20 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
2ae30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2ae40 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
2ae50 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
2ae60 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
2ae70 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
2ae80 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
2ae90 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
2aea0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
2aeb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
2aec0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
2aed0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2aee0 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
2aef0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2af00 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
2af10 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
2af20 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
2af30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2af40 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
2af50 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
2af60 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
2af70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2af80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2af90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2afa0 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
2afb0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
2afc0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
2afd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2afe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2aff0 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30  , OP_AggStep0, 0
2b000 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
2b010 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
2b020 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
2b030 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
2b040 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
2b050 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2b060 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
2b070 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2b080 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
2b090 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2b0a0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
2b0b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
2b0c0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
2b0d0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
2b0e0 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
2b0f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b100 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2b110 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
2b120 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2b130 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2b140 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2b150 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
2b160 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
2b170 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
2b180 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
2b190 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
2b1a0 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
2b1b0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
2b1c0 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
2b1d0 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
2b1e0 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
2b1f0 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
2b200 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
2b210 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
2b220 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
2b230 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
2b240 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
2b250 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
2b260 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
2b270 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
2b280 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
2b290 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
2b2a0 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
2b2b0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
2b2c0 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
2b2d0 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
2b2e0 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
2b2f0 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
2b300 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
2b310 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
2b320 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
2b330 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
2b340 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
2b350 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
2b360 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
2b370 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
2b380 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2b390 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
2b3a0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2b3b0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2b3c0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2b3d0 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
2b3e0 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
2b3f0 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
2b400 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
2b410 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
2b420 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2b430 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
2b440 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
2b450 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
2b460 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
2b470 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2b480 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2b490 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
2b4a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2b4b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2b4c0 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
2b4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2b4e0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
2b4f0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
2b500 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
2b510 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
2b520 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
2b530 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
2b540 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
2b550 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2b560 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
2b570 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
2b580 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
2b590 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5b0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
2b5c0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2b5d0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2b5e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
2b5f0 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
2b600 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
2b630 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
2b640 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
2b650 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
2b660 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
2b670 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
2b680 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
2b690 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
2b6a0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2b6b0 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72  Idx)));.    char
2b6c0 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
2b6d0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
2b6e0 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
2b6f0 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
2b700 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2b710 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
2b720 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
2b730 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
2b740 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
2b750 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
2b760 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
2b770 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
2b780 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
2b790 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
2b7a0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2b7b0 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
2b7c0 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
2b7d0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
2b7e0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
2b7f0 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
2b800 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73  .#endif../*.** s
2b810 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
2b820 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
2b830 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  y havingToWhere(
2b840 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
2b850 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20 74  node passed to t
2b860 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61  he callback is a
2b870 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65   TK_AND node, re
2b880 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e  turn .** WRC_Con
2b890 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71  tinue to tell sq
2b8a0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
2b8b0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2b8c0 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a  gh child nodes..
2b8d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
2b8e0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2b8f0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
2b900 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74   also check if t
2b910 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65  he .** sub-expre
2b920 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68  ssion matches th
2b930 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20 62  e criteria for b
2b940 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
2b950 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  e WHERE.** claus
2b960 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74  e. If so, add it
2b970 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2b980 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65  ause and replace
2b990 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73 73   the sub-express
2b9a0 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ion.** within th
2b9b0 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
2b9c0 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74  ion with a const
2b9d0 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74  ant "1"..*/.stat
2b9e0 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57  ic int havingToW
2b9f0 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65  hereExprCb(Walke
2ba00 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2ba10 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
2ba20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e  pExpr->op!=TK_AN
2ba30 44 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  D ){.    Select 
2ba40 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  *pS = pWalker->u
2ba50 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  .pSelect;.    if
2ba60 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
2ba70 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
2ba80 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
2ba90 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e 70 47 72  , pExpr, pS->pGr
2baa0 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20  oupBy) ){.      
2bab0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
2bac0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64  alker->pParse->d
2bad0 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
2bae0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2baf0 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e  rAlloc(db, TK_IN
2bb00 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49  TEGER, &sqlite3I
2bb10 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b  ntTokens[1], 0);
2bb20 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
2bb30 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
2bb40 2a 70 57 68 65 72 65 20 3d 20 70 53 2d 3e 70 57  *pWhere = pS->pW
2bb50 68 65 72 65 3b 0a 20 20 20 20 20 20 20 20 53 57  here;.        SW
2bb60 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20  AP(Expr, *pNew, 
2bb70 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  *pExpr);.       
2bb80 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
2bb90 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72  xprAnd(db, pWher
2bba0 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  e, pNew);.      
2bbb0 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20 70    pS->pWhere = p
2bbc0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57 61  New;.        pWa
2bbd0 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b  lker->eCode = 1;
2bbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bbf0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2bc00 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
2bc10 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2bc20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
2bc30 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73  r eligible terms
2bc40 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47   from the HAVING
2bc50 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65   clause of a que
2bc60 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ry, which is.** 
2bc70 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20  processed after 
2bc80 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65  grouping, to the
2bc90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77   WHERE clause, w
2bca0 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65  hich is processe
2bcb0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75  d before.** grou
2bcc0 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ping. For exampl
2bcd0 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  e, the query:.**
2bce0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
2bcf0 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45  ROM <tables> WHE
2bd00 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20  RE a=? GROUP BY 
2bd10 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44  b HAVING b=? AND
2bd20 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62   c=?.**.** can b
2bd30 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a  e rewritten as:.
2bd40 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
2bd50 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
2bd60 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f  HERE a=? AND b=?
2bd70 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
2bd80 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74  NG c=?.**.** A t
2bd90 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e  erm of the HAVIN
2bda0 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  G expression is 
2bdb0 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61  eligible for tra
2bdc0 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73  nsfer if it cons
2bdd0 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79  ists.** entirely
2bde0 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e   of constants an
2bdf0 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  d expressions th
2be00 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55  at are also GROU
2be10 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a  P BY terms that.
2be20 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41  ** use the "BINA
2be30 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  RY" collation se
2be40 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
2be50 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57  c void havingToW
2be60 68 65 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  here(Parse *pPar
2be70 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2be80 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72    Walker sWalker
2be90 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ;.  memset(&sWal
2bea0 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ker, 0, sizeof(s
2beb0 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c  Walker));.  sWal
2bec0 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61  ker.pParse = pPa
2bed0 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rse;.  sWalker.x
2bee0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68  ExprCallback = h
2bef0 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2bf00 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
2bf10 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73  pSelect = p;.  s
2bf20 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
2bf30 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76  sWalker, p->pHav
2bf40 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  ing);.#if SELECT
2bf50 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2bf60 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64  if( sWalker.eCod
2bf70 65 20 26 26 20 28 73 71 6c 69 74 65 33 53 65 6c  e && (sqlite3Sel
2bf80 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2bf90 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  )!=0 ){.    SELE
2bfa0 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50  CTTRACE(0x100,pP
2bfb0 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41  arse,p,("Move HA
2bfc0 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f 20  VING terms into 
2bfd0 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20  WHERE:\n"));.   
2bfe0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2bff0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2c000 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
2c010 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
2c020 65 20 69 66 20 74 68 65 20 70 54 68 69 73 20 65  e if the pThis e
2c030 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73 74  ntry of pTabList
2c040 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20   is a self-join 
2c050 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65 77 2e  of a prior view.
2c060 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68  .** If it is, th
2c070 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53 72  en return the Sr
2c080 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20 74  cList_item for t
2c090 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20 20  he prior view.  
2c0a0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a  If it is not,.**
2c0b0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a   then return 0..
2c0c0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
2c0d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69   SrcList_item *i
2c0e0 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20  sSelfJoinView(. 
2c0f0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2c100 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st,           /*
2c110 20 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c 66   Search for self
2c120 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20 46  -joins in this F
2c130 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
2c140 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2c150 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a 20  tem *pThis   /* 
2c160 53 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f 72  Search for prior
2c170 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2c180 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29  is subquery */.)
2c190 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
2c1a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2c1b0 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70 54    for(pItem = pT
2c1c0 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d  abList->a; pItem
2c1d0 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29  <pThis; pItem++)
2c1e0 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
2c1f0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f  >pSelect==0 ) co
2c200 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c210 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2c220 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75  outine ) continu
2c230 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  e;.    if( pItem
2c240 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e  ->zName==0 ) con
2c250 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2c260 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2c270 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c  Item->zDatabase,
2c280 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61 73   pThis->zDatabas
2c290 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2c2a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2c2b0 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d  3_stricmp(pItem-
2c2c0 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a  >zName, pThis->z
2c2d0 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69  Name)!=0 ) conti
2c2e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  nue;.    if( sql
2c2f0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
2c300 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54  0, .          pT
2c310 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57  his->pSelect->pW
2c320 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  here, pItem->pSe
2c330 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31  lect->pWhere, -1
2c340 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
2c350 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61 73 20  /* The view was 
2c360 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d 65  modified by some
2c370 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
2c380 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20 20  ion such as.    
2c390 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68 65    ** pushDownWhe
2c3a0 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20  reTerms() */.   
2c3b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2c3c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49   }.    return pI
2c3d0 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tem;.  }.  retur
2c3e0 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
2c3f0 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
2c400 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  W_OPTIMIZATION./
2c410 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2c420 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65 72  transform a quer
2c430 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
2c440 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .**    SELECT co
2c450 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c  unt(*) FROM (SEL
2c460 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55 4e  ECT x FROM t1 UN
2c470 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 79  ION ALL SELECT y
2c480 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20   FROM t2).**.** 
2c490 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Into this:.**.**
2c4a0 20 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45      SELECT (SELE
2c4b0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2c4c0 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f 75   t1)+(SELECT cou
2c4d0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a  nt(*) FROM t2).*
2c4e0 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66 6f  *.** The transfo
2c4f0 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72  rmation only wor
2c500 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ks if all of the
2c510 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
2c520 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  rue:.**.**   *  
2c530 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
2c540 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74  a UNION ALL of t
2c550 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
2c560 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20 69  .**   *  There i
2c570 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47 52  s no WHERE or GR
2c580 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47  OUP BY or HAVING
2c590 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20   clauses on the 
2c5a0 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20  subqueries.**   
2c5b0 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  *  The outer que
2c5c0 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63  ry is a simple c
2c5d0 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65  ount(*).**.** Re
2c5e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2c5f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2c600 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a   undertaken..*/.
2c610 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
2c620 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69  OfViewOptimizati
2c630 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
2c640 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2c650 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70  Select *pSub, *p
2c660 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70  Prior;.  Expr *p
2c670 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43  Expr;.  Expr *pC
2c680 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  ount;.  sqlite3 
2c690 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73  *db;.  if( (p->s
2c6a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2c6b0 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74  regate)==0 ) ret
2c6c0 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73  urn 0;   /* This
2c6d0 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
2c6e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   */.  if( p->pEL
2c6f0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
2c700 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c710 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
2c720 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
2c730 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  */.  pExpr = p->
2c740 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
2c750 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  pr;.  if( pExpr-
2c760 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
2c770 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
2c780 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2c790 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  t is an aggregat
2c7a0 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  e */.  if( sqlit
2c7b0 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72  e3_stricmp(pExpr
2c7c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e  ->u.zToken,"coun
2c7d0 74 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  t") ) return 0; 
2c7e0 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20 2a   /* Is count() *
2c7f0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78  /.  if( pExpr->x
2c800 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75  .pList!=0 ) retu
2c810 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c820 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
2c830 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69   count(*) */.  i
2c840 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  f( p->pSrc->nSrc
2c850 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e   /* One table in
2c880 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62   FROM  */.  pSub
2c890 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
2c8a0 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  .pSelect;.  if( 
2c8b0 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pSub==0 ) return
2c8c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c8e0 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20 73   The FROM is a s
2c8f0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28  ubquery */.  if(
2c900 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
2c910 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c930 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d 70  * Must be a comp
2c940 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b  ound ry */.  do{
2c950 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f  .    if( pSub->o
2c960 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75  p!=TK_ALL && pSu
2c970 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  b->pPrior ) retu
2c980 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62  rn 0;  /* Must b
2c990 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20  e UNION ALL */. 
2c9a0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68     if( pSub->pWh
2c9b0 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45       /* No WHERE
2c9e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69   clause */.    i
2c9f0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
2ca00 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2ca10 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2ca20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72 65   /* Not an aggre
2ca30 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75 62  gate */.    pSub
2ca40 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca70 20 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f 6d   Repeat over com
2ca80 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c  pound */.  }whil
2ca90 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a  e( pSub );..  /*
2caa0 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
2cab0 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69 74 20  s point then it 
2cac0 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d  is OK to perform
2cad0 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
2cae0 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ion */..  db = p
2caf0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f  Parse->db;.  pCo
2cb00 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 70  unt = pExpr;.  p
2cb10 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 75 62  Expr = 0;.  pSub
2cb20 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
2cb30 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70  .pSelect;.  p->p
2cb40 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2cb50 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
2cb60 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
2cb70 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d  , p->pSrc);.  p-
2cb80 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44  >pSrc = sqlite3D
2cb90 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
2cba0 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
2cbb0 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77 68 69  p->pSrc));.  whi
2cbc0 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  le( pSub ){.    
2cbd0 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Expr *pTerm;.   
2cbe0 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e   pPrior = pSub->
2cbf0 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53 75 62  pPrior;.    pSub
2cc00 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
2cc10 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20    pSub->pNext = 
2cc20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c  0;.    pSub->sel
2cc30 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
2cc40 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75 62 2d  egate;.    pSub-
2cc50 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2cc60 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70  _Compound;.    p
2cc70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
2cc80 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2cc90 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2cca0 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  b, pSub->pEList)
2ccb0 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 50  ;.    pTerm = pP
2ccc0 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33 45 78  rior ? sqlite3Ex
2ccd0 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75 6e 74  prDup(db, pCount
2cce0 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20  , 0) : pCount;. 
2ccf0 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 20     pSub->pEList 
2cd00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2cd10 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2cd20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 70  0, pTerm);.    p
2cd30 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 50 45  Term = sqlite3PE
2cd40 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53  xpr(pParse, TK_S
2cd50 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20  ELECT, 0, 0);.  
2cd60 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64    sqlite3PExprAd
2cd70 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  dSelect(pParse, 
2cd80 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20  pTerm, pSub);.  
2cd90 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
2cda0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  {.      pExpr = 
2cdb0 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65  pTerm;.    }else
2cdc0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  {.      pExpr = 
2cdd0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2cde0 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54  rse, TK_PLUS, pT
2cdf0 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  erm, pExpr);.   
2ce00 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20 70 50   }.    pSub = pP
2ce10 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  rior;.  }.  p->p
2ce20 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
2ce30 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e  r = pExpr;.  p->
2ce40 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2ce50 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69 66 20  Aggregate;..#if 
2ce60 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2ce70 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
2ce80 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2ce90 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
2cea0 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
2ceb0 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63  arse,p,("After c
2cec0 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74  ount-of-view opt
2ced0 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b  imization:\n"));
2cee0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2cef0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2cf00 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2cf10 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2cf20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43  ndif /* SQLITE_C
2cf30 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
2cf40 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  IZATION */../*.*
2cf50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2cf60 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
2cf70 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
2cf80 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
2cf90 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
2cfa0 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
2cfb0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
2cfc0 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
2cfd0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
2cfe0 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
2cff0 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
2d000 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
2d010 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2d020 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2d030 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2d040 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
2d050 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
2d060 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
2d070 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
2d080 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
2d090 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
2d0a0 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
2d0b0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
2d0c0 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
2d0d0 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
2d0e0 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
2d0f0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2d100 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
2d110 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2d120 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
2d130 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2d140 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2d150 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
2d160 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
2d170 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
2d180 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
2d190 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
2d1a0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
2d1b0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
2d1c0 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
2d1d0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
2d1e0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2d1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2d200 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
2d210 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
2d220 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
2d230 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
2d240 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
2d250 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
2d260 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
2d270 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
2d280 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
2d290 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
2d2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d2b0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
2d2c0 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
2d2d0 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
2d2e0 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20  t *pEList = 0;  
2d2f0 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
2d300 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
2d310 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
2d320 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
2d330 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
2d340 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
2d350 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
2d360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2d370 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
2d380 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2d390 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
2d3a0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
2d3b0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
2d3c0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
2d3d0 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
2d3e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
2d3f0 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
2d400 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
2d410 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
2d420 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2d430 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
2d440 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2d450 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
2d460 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
2d470 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
2d480 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
2d490 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
2d4a0 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
2d4b0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
2d4c0 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
2d4d0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
2d4e0 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
2d4f0 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
2d500 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
2d510 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2d520 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
2d530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2d540 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
2d550 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
2d560 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
2d570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d580 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
2d590 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
2d5a0 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65  ist *pMinMaxOrde
2d5b0 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64  rBy = 0;  /* Add
2d5c0 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f 72 20  ed ORDER BY for 
2d5d0 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73 20  min/max queries 
2d5e0 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c  */.  u8 minMaxFl
2d5f0 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ag;             
2d600 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20      /* Flag for 
2d610 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73 20  min/max queries 
2d620 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2d630 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2d640 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
2d650 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
2d660 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
2d670 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
2d680 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
2d690 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
2d6a0 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
2d6b0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
2d6c0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2d6d0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
2d6e0 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
2d6f0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
2d700 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2d710 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2d720 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
2d730 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
2d740 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
2d750 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
2d760 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43  nfo));.#if SELEC
2d770 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2d780 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2d790 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e  Parse,p, ("begin
2d7a0 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29   processing:\n")
2d7b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2d7c0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2d7d0 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  100 ){.    sqlit
2d7e0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2d7f0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2d800 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2d810 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2d820 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2d830 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
2d840 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2d850 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2d860 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46  st->eDest!=SRT_F
2d870 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2d880 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2d890 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2d8a0 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
2d8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2d8c0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2d8d0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2d8e0 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49  Queue );.  if( I
2d8f0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2d900 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
2d910 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
2d920 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
2d930 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d940 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
2d950 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2d960 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
2d970 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d980 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c  ==SRT_Discard ||
2d990 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2d9a0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75  t->eDest==SRT_Qu
2d9b0 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65  eue  || pDest->e
2d9c0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
2d9d0 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  fo ||.          
2d9e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2d9f0 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20  RT_DistQueue || 
2da00 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2da10 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20  T_Fifo);.    /* 
2da20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
2da30 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
2da40 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
2da50 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
2da60 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
2da70 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
2da80 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
2da90 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2daa0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
2dab0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
2dac0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2dad0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2dae0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2daf0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2db00 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
2db10 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  , 0);.  memset(&
2db20 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
2db30 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
2db40 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2db50 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62  pOrderBy;.  pTab
2db60 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2db70 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2db80 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
2db90 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2dba0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2dbb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2dbc0 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69  pEList!=0 );.  i
2dbd0 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
2dbe0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2dbf0 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45  te)!=0;.#if SELE
2dc00 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2dc10 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2dc20 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2dc30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2dc40 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2dc50 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65  ,p, ("after name
2dc60 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29   resolution:\n")
2dc70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2dc80 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2dc90 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2dca0 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  f..  /* Get a po
2dcb0 69 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75  inter the VDBE u
2dcc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
2dcd0 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  n, allocating a 
2dce0 6e 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a  new VDBE if one.
2dcf0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c    ** does not al
2dd00 72 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20  ready exist */. 
2dd10 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2dd20 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
2dd30 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
2dd40 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28  elect_end;.  if(
2dd50 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2dd60 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
2dd70 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
2dd80 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b  ames(pParse, p);
2dd90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74  .  }..  /* Try t
2dda0 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  o various optimi
2ddb0 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e  zations (flatten
2ddc0 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c 20  ing subqueries, 
2ddd0 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a  and strength.  *
2dde0 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a  * reduction of j
2ddf0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69  oin operators) i
2de00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2de10 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
2de20 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
2de30 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2de40 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2de50 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2de60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2de70 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
2de80 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
2de90 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2dea0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2deb0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2dec0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2ded0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
2dee0 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2def0 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ect;.    Table *
2df00 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
2df10 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  ab;..    /* Conv
2df20 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e  ert LEFT JOIN in
2df30 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65  to JOIN if there
2df40 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68   are terms of th
2df50 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20  e right table.  
2df60 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54    ** of the LEFT
2df70 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68   JOIN used in th
2df80 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
2df90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2dfa0 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2dfb0 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
2dfc0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
2dfd0 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75  ExprImpliesNonNu
2dfe0 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c  llRow(p->pWhere,
2dff0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2e000 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
2e010 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2e020 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79   SQLITE_Simplify
2e030 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  Join).    ){.   
2e040 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2e050 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20  x100,pParse,p,. 
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e070 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c  "LEFT-JOIN simpl
2e080 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e  ifies to JOIN on
2e090 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b   term %d\n",i));
2e0a0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
2e0b0 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a  .jointype &= ~(J
2e0c0 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29  T_LEFT|JT_OUTER)
2e0d0 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69  ;.      unsetJoi
2e0e0 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c  nExpr(p->pWhere,
2e0f0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2e100 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2e110 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e  No futher action
2e120 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66   if this term of
2e130 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2e140 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72   is no a subquer
2e150 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75  y */.    if( pSu
2e160 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2e170 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d  ..    /* Catch m
2e180 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64  ismatch in the d
2e190 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20  eclared columns 
2e1a0 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  of a view and th
2e1b0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2e1c0 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
2e1d0 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20  e SELECT on the 
2e1e0 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  RHS */.    if( p
2e1f0 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d  Tab->nCol!=pSub-
2e200 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
2e210 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2e220 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2e230 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c  "expected %d col
2e240 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75  umns for '%s' bu
2e250 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20  t got %d",.     
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e270 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
2e280 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e  b->zName, pSub->
2e290 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2e2a0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2e2b0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
2e2c0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20    /* Do not try 
2e2d0 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67  to flatten an ag
2e2e0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
2e2f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2e300 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67  Flattening an ag
2e310 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 79  gregate subquery
2e320 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
2e330 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
2e340 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e  uery.    ** is n
2e350 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20  ot a join.  But 
2e360 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
2e370 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
2e380 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
2e390 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  ery.    ** will 
2e3a0 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  be implemented a
2e3b0 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61  s a co-routine a
2e3c0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  nd there is no a
2e3d0 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20  dvantage to.    
2e3e0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ** flattening in
2e3f0 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
2e400 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75 62  */.    if( (pSub
2e410 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2e420 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29 20  Aggregate)!=0 ) 
2e430 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
2e440 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f  sert( pSub->pGro
2e450 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  upBy==0 );..    
2e460 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  /* If the outer 
2e470 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2e480 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c   "complex" resul
2e490 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a  t set (that is,.
2e4a0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65      ** if the re
2e4b0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
2e4c0 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65 73  outer query uses
2e4d0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75   functions or su
2e4e0 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a  bqueries).    **
2e4f0 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62 71   and if the subq
2e500 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  uery contains an
2e510 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
2e520 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69   and if.    ** i
2e530 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d  t will be implem
2e540 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
2e550 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e  utine, then do n
2e560 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69  ot flatten.  Thi
2e570 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63  s.    ** restric
2e580 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20  tion allows SQL 
2e590 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20  constructs like 
2e5a0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
2e5b0 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65   **  SELECT expe
2e5c0 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78  nsive_function(x
2e5d0 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d  ).    **    FROM
2e5e0 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
2e5f0 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c  tab ORDER BY y L
2e600 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a  IMIT 10);.    **
2e610 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65  .    ** The expe
2e620 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29  nsive_function()
2e630 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65   is only compute
2e640 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73  d on the 10 rows
2e650 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65   that.    ** are
2e660 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72 20   output, rather 
2e670 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f  than every row o
2e680 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
2e690 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
2e6a0 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20  equirement that 
2e6b0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2e6c0 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72  have a complex r
2e6d0 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a  esult set.    **
2e6e0 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74   means that flat
2e6f0 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75  tening does occu
2e700 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c  r on simpler SQL
2e710 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74   constraints wit
2e720 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  hout.    ** the 
2e730 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69  expensive_functi
2e740 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a  on() like:.    *
2e750 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
2e760 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
2e770 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52  x FROM tab ORDER
2e780 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b   BY y LIMIT 10);
2e790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e7a0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d  pSub->pOrderBy!=
2e7b0 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20  0.     && i==0. 
2e7c0 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c      && (p->selFl
2e7d0 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78  ags & SF_Complex
2e7e0 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20  Result)!=0.     
2e7f0 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
2e800 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c  rc==1.         |
2e810 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
2e820 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
2e830 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
2e840 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
2e850 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2e860 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74   }..    if( flat
2e870 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
2e880 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29  se, p, i, isAgg)
2e890 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2e8a0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
2e8b0 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
2e8c0 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
2e8d0 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20       i = -1;.   
2e8e0 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20   }.    pTabList 
2e8f0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
2e900 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2e910 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
2e920 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21  t_end;.    if( !
2e930 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
2e940 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
2e950 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2e960 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
2e970 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2e980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e990 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
2e9a0 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
2e9b0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
2e9c0 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
2e9d0 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
2e9e0 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
2e9f0 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
2ea00 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2ea10 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2ea20 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2ea30 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2ea40 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2ea50 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2ea60 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2ea70 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2ea80 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2ea90 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2eaa0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2eab0 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2eac0 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2ead0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
2eae0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2eaf0 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  dif..  /* For ea
2eb00 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
2eb10 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74  ROM clause, do t
2eb20 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20  wo things:.  ** 
2eb30 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75  (1) Authorized u
2eb40 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
2eb50 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65  es.  ** (2) Gene
2eb60 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
2eb70 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20  l sub-queries.  
2eb80 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
2eb90 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
2eba0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
2ebb0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2ebc0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2ebd0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
2ebe0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
2ebf0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23   Select *pSub;.#
2ec00 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2ec10 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2ec20 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2ec30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2ec40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ec50 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
2ec60 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  t;.#endif..    /
2ec70 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52  * Issue SQLITE_R
2ec80 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  EAD authorizatio
2ec90 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63  ns with a fake c
2eca0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61  olumn name for a
2ecb0 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  ny.    ** tables
2ecc0 20 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65   that are refere
2ecd0 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68  nced but from wh
2ece0 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72  ich no values ar
2ecf0 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20  e extracted..   
2ed00 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20   ** Examples of 
2ed10 77 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64  where these kind
2ed20 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45  s of null SQLITE
2ed30 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74  _READ authorizat
2ed40 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  ions.    ** woul
2ed50 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a  d occur:.    **.
2ed60 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
2ed70 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2ed80 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f  t1;   -- SQLITE_
2ed90 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a  READ t1."".    *
2eda0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e  *     SELECT t1.
2edb0 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20  * FROM t1, t2;  
2edc0 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
2edd0 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20  t2."".    **.   
2ede0 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c   ** The fake col
2edf0 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65  umn name is an e
2ee00 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74  mpty string.  It
2ee10 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2ee20 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20   a table to.    
2ee30 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e  ** have a column
2ee40 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d   named by the em
2ee50 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77  pty string, in w
2ee60 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20  hich case there 
2ee70 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20  is no way to.   
2ee80 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20   ** distinguish 
2ee90 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66  between an unref
2eea0 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e  erenced table an
2eeb0 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65  d an actual refe
2eec0 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20  rence to the.   
2eed0 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54   ** "" column. T
2eee0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
2eef0 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66  gn was for the f
2ef00 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
2ef10 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20  to be a NULL,.  
2ef20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64    ** which would
2ef30 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e   be unambiguous.
2ef40 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74    But legacy aut
2ef50 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62  horization callb
2ef60 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a  acks might.    *
2ef70 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c  * assume the col
2ef80 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d  umn name is non-
2ef90 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c  NULL and segfaul
2efa0 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  t.  The use of a
2efb0 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73  n empty.    ** s
2efc0 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61  tring for the fa
2efd0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73  ke column name s
2efe0 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20  eems safer..    
2eff0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
2f000 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a  ->colUsed==0 ){.
2f010 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
2f020 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
2f030 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65  QLITE_READ, pIte
2f040 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49  m->zName, "", pI
2f050 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
2f060 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
2f070 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2f080 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
2f090 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2f0a0 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20  IT_VIEW).    /* 
2f0b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2f0c0 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
2f0d0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2f0e0 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ause.    */.    
2f0f0 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
2f100 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70  elect;.    if( p
2f110 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
2f120 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74  e;..    /* Somet
2f130 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  imes the code fo
2f140 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c  r a subquery wil
2f150 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  l be generated m
2f160 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ore than.    ** 
2f170 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62  once, if the sub
2f180 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
2f190 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2f1a0 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e in a LEFT JOIN
2f1b0 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61  ,.    ** for exa
2f1c0 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  mple.  In that c
2f1d0 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65  ase, do not rege
2f1e0 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
2f1f0 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20  to manifest.    
2f200 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65  ** a view or the
2f210 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69   co-routine to i
2f220 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e  mplement a view.
2f230 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74    The first inst
2f240 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  ance.    ** is s
2f250 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67  ufficient, thoug
2f260 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  h the subroutine
2f270 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65   to manifest the
2f280 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a   view does need.
2f290 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
2f2a0 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  oked again. */. 
2f2b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
2f2c0 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
2f2d0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2f2e0 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  .viaCoroutine==0
2f2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2f300 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
2f310 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65  at manifests the
2f320 20 76 69 65 77 20 6d 69 67 68 74 20 62 65 20 61   view might be a
2f330 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e   one-time routin
2f340 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  e,.        ** or
2f350 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74   it might need t
2f360 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61  o be rerun on ea
2f370 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63  ch iteration bec
2f380 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 20 20  ause it.        
2f390 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72  ** encodes a cor
2f3a0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
2f3b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73  . */.        tes
2f3c0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 56 64  tcase( sqlite3Vd
2f3d0 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d  beGetOp(v, pItem
2f3e0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e  ->addrFillSub)->
2f3f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20  opcode==OP_Once 
2f400 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f420 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
2f430 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
2f440 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
2f450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2f460 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
2f470 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2f480 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
2f490 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
2f4a0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
2f4b0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
2f4c0 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  ee referred to b
2f4d0 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
2f4e0 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
2f4f0 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
2f500 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
2f510 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
2f520 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
2f530 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
2f540 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
2f550 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
2f560 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
2f570 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
2f580 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
2f590 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
2f5a0 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
2f5b0 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
2f5c0 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
2f5d0 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
2f5e0 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
2f5f0 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2f600 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ht(p);..    /* M
2f610 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f  ake copies of co
2f620 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61  nstant WHERE-cla
2f630 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  use terms in the
2f640 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77   outer query dow
2f650 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20  n.    ** inside 
2f660 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
2f670 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65  his can help the
2f680 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e   subquery to run
2f690 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c   more efficientl
2f6a0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2f6b0 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  ( (pItem->fg.joi
2f6c0 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
2f6d0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74  )==0.     && Opt
2f6e0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2f6f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68  (db, SQLITE_Push
2f700 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75  Down).     && pu
2f710 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2f720 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70  (pParse, pSub, p
2f730 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2f740 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29 7b  >iCursor).    ){
2f750 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2f760 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69  _ENABLED.      i
2f770 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2f780 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2f790 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54  .        SELECTT
2f7a0 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2f7b0 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52  e,p,("After WHER
2f7c0 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f  E-clause push-do
2f7d0 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  wn:\n"));.      
2f7e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2f7f0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2f800 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2f810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f820 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2f830 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50  100,pParse,p,("P
2f840 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73  ush-down not pos
2f850 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20  sible\n"));.    
2f860 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74  }..    zSavedAut
2f870 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
2f880 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
2f890 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
2f8a0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
2f8b0 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f  m->zName;..    /
2f8c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2f8d0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2f8e0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a   subquery.    **
2f8f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71  .    ** The subq
2f900 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e  uery is implemen
2f910 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
2f920 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75  ine if the subqu
2f930 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75  ery is.    ** gu
2f940 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
2f950 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
2f960 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
2f970 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
2f980 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f    ** computed mo
2f990 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20  re than once).  
2f9a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
2f9b0 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
2f9c0 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
2f9d0 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
2f9e0 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
2f9f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
2fa00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2fa10 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
2fa20 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
2fa30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2fa40 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
2fa50 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
2fa60 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2fa70 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
2fa80 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70   ){.      /* Imp
2fa90 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74  lement a co-rout
2faa0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
2fab0 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
2fac0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
2fad0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
2fae0 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  each invocation.
2faf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2fb00 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71  int addrTop = sq
2fb10 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2fb20 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20  Addr(v)+1;.     
2fb30 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2fb40 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2fb50 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2fb60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fb70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
2fb80 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2fb90 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
2fba0 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
2fbb0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2fbc0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2fbd0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
2fbe0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2fbf0 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
2fc00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2fc10 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2fc20 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
2fc30 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2fc40 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2fc50 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2fc60 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2fc70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2fc80 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2fc90 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2fca0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2fcb0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2fcc0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2fcd0 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
2fce0 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
2fcf0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2fd00 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
2fd10 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
2fd20 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
2fd30 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
2fd40 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d  routine(v, pItem
2fd50 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2fd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2fd70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
2fd80 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
2fd90 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
2fda0 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
2fdb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fdc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2fdd0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
2fde0 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
2fdf0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
2fe00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
2fe10 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
2fe20 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
2fe30 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
2fe40 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
2fe50 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
2fe60 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
2fe70 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
2fe80 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
2fe90 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
2fea0 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
2feb0 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
2fec0 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
2fed0 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
2fee0 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
2fef0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
2ff00 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
2ff10 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
2ff20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2ff30 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20  item *pPrior;.. 
2ff40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
2ff50 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
2ff60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
2ff70 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
2ff80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2ff90 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
2ffa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ffb0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2ffc0 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
2ffd0 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
2ffe0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2fff0 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
30000 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
30010 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
30020 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30030 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
30040 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
30050 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
30060 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
30070 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
30080 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
30090 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
300a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
300b0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
300c0 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
300d0 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
300e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
300f0 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
30100 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30110 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
30120 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
30130 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
30140 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
30150 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
30160 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
30170 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
30180 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
30190 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
301a0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
301b0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
301c0 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70  isSelfJoinView(p
301d0 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b  TabList, pItem);
301e0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
301f0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
30200 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30210 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49  , OP_OpenDup, pI
30220 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  tem->iCursor, pP
30230 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  rior->iCursor);.
30240 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
30250 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
30260 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69  >iSelectId, pPri
30270 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a  or->iSelectId);.
30280 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30290 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21  pPrior->pSelect!
302a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
302b0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
302c0 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
302d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
302e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
302f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
30300 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
30310 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
30320 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
30330 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65         explainSe
30340 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
30350 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
30360 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
30370 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73  ctId);.        s
30380 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
30390 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
303a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
303b0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
303c0 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
303d0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
303e0 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
303f0 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
30400 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
30410 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
30420 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
30430 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
30440 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
30450 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
30460 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
30470 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
30480 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
30490 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
304a0 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
304b0 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
304c0 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
304d0 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
304e0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
304f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
30500 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
30510 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
30520 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
30530 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
30540 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50  eight(p);.    pP
30550 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
30560 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
30570 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20  ontext;.#endif. 
30580 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
30590 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
305a0 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
305b0 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
305c0 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
305d0 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
305e0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
305f0 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
30600 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
30610 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
30620 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
30630 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
30640 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
30650 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30660 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
30670 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
30680 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
30690 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
306a0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
306b0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
306c0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
306d0 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
306e0 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
306f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
30700 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
30710 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
30720 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
30730 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
30740 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
30750 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
30760 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
30770 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
30780 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
30790 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
307a0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
307b0 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
307c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
307d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
307e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
307f0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
30800 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
30810 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
30820 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
30830 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
30840 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
30850 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
30860 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
30870 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
30880 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
30890 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
308a0 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
308b0 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
308c0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
308d0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
308e0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
308f0 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
30900 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
30910 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
30920 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
30930 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
30940 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
30950 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
30960 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
30970 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
30980 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
30990 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
309a0 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
309b0 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
309c0 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
309d0 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
309e0 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
309f0 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
30a00 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
30a10 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
30a20 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
30a30 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
30a40 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
30a50 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
30a60 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
30a70 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
30a80 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
30a90 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
30aa0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
30ab0 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
30ac0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
30ad0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
30ae0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
30af0 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
30b00 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
30b10 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
30b20 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
30b30 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
30b40 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
30b50 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
30b60 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
30b70 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
30b80 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
30b90 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
30ba0 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
30bb0 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
30bc0 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
30bd0 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
30be0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
30bf0 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
30c00 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
30c10 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
30c20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
30c30 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
30c40 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
30c50 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
30c60 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
30c70 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
30c80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
30c90 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
30ca0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
30cb0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
30cc0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
30cd0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
30ce0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
30cf0 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
30d00 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
30d10 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
30d20 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
30d30 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30d40 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
30d50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
30d60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
30d70 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
30d80 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
30d90 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
30da0 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
30db0 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
30dc0 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
30dd0 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
30de0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
30df0 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
30e00 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
30e10 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
30e20 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
30e30 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
30e40 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
30e50 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
30e60 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
30e70 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
30e80 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
30e90 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
30ea0 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
30eb0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
30ec0 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
30ed0 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
30ee0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
30ef0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
30f00 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
30f10 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
30f20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
30f30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
30f40 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
30f50 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
30f60 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
30f70 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
30f80 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
30f90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
30fa0 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
30fb0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
30fc0 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
30fd0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
30fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30ff0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
31000 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
31010 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
31020 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
31030 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
31040 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
31050 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
31060 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
31070 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
31080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
31090 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
310a0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
310b0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
310c0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
310d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
310e0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
310f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
31100 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
31110 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
31120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31130 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
31140 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
31150 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
31160 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
31170 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
31180 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
31190 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
311a0 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
311b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
311c0 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
311d0 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
311e0 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
311f0 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
31200 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
31210 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
31220 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
31230 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
31240 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
31250 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
31260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
31270 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
31280 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
31290 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
312a0 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
312b0 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
312c0 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
312d0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
312e0 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
312f0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
31300 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
31310 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
31320 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
31330 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
31340 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
31350 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
31360 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
31370 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
31380 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
31390 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
313a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313b0 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
313c0 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
313d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
313e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313f0 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
31400 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
31410 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
31420 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31440 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
31450 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
31460 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
31470 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
31480 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
31490 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
314a0 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
314b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
314c0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
314d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
314e0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
314f0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
31500 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
31510 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
31520 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
31530 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
31540 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
31550 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
31560 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
31570 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
31580 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
31590 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
315a0 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20  ==SF_FixedLimit 
315b0 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  );.    wctrlFlag
315c0 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  s |= p->selFlags
315d0 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
315e0 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
315f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
31600 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43 54  n. */.    SELECT
31610 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
31620 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
31630 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d  ));.    pWInfo =
31640 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
31650 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
31660 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
31670 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
31680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31690 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
316a0 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
316b0 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  s, p->nSelectRow
316c0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
316d0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
316e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
316f0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
31700 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
31710 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
31720 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
31730 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
31740 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
31750 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
31760 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
31770 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
31780 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
31790 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
317a0 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
317b0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
317c0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
317d0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
317e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
317f0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
31800 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
31810 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
31820 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
31830 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  o);.      sSort.
31840 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
31850 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  p = sqlite3Where
31860 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
31870 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
31880 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
31890 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
318a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
318b0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
318c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
318d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
318e0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
318f0 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
31900 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
31910 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
31920 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
31930 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
31940 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
31950 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
31960 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
31970 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
31980 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
31990 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
319a0 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
319b0 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
319c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
319d0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
319e0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
319f0 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
31a00 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
31a10 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
31a20 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p. */.    assert
31a30 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c  ( p->pEList==pEL
31a40 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65 63  ist );.    selec
31a50 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
31a60 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74  e, p, -1, &sSort
31a70 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
31a80 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
31a90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31aa0 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
31ab0 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ad0 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
31ae0 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
31af0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
31b00 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
31b10 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
31b20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
31b30 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
31b40 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
31b50 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
31b60 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
31b70 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
31b80 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
31b90 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
31ba0 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
31bb0 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
31bc0 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
31bd0 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
31be0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
31bf0 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
31c00 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31c10 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
31c20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
31c30 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
31c40 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
31c50 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
31c60 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
31c70 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
31c80 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
31c90 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
31ca0 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
31cb0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
31cc0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ce0 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
31cf0 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
31d00 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
31d10 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
31d40 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
31d50 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
31d60 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
31d70 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
31d80 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
31d90 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
31da0 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
31db0 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
31dc0 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
31dd0 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
31de0 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
31df0 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
31e00 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
31e10 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
31e20 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
31e30 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
31e40 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
31e50 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
31e60 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
31e70 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
31e80 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
31e90 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
31ea0 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70    int orderByGrp
31eb0 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66   = 0; /* True if
31ec0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e   the GROUP BY an
31ed0 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74  d ORDER BY are t
31ee0 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  he same */..    
31ef0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
31f00 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
31f10 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
31f20 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
31f30 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
31f40 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
31f50 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
31f60 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
31f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
31f90 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
31fa0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
31fb0 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
31fc0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
31fd0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
31fe0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
31ff0 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
32000 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
32010 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
32020 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
32030 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
32040 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
32050 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
32060 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
32070 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
32080 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
32090 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
320a0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
320b0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
320c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36 36        assert( 66
320d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
320e0 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  100) );.      if
320f0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
32100 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  66 ) p->nSelectR
32110 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c  ow = 66;.    }el
32120 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
32130 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
32140 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70  st(1) );.      p
32150 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
32160 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
32170 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
32180 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
32190 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
321a0 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
321b0 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c      ** identical
321c0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65  , then it may be
321d0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73   possible to dis
321e0 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42  able the ORDER B
321f0 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a  Y clause .    **
32200 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20   on the grounds 
32210 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20 42  that the GROUP B
32220 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65  Y will cause ele
32230 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75  ments to come ou
32240 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  t .    ** in the
32250 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20   correct order. 
32260 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20  It also may not 
32270 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d  - the GROUP BY m
32280 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a  ight use a.    *
32290 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  * database index
322a0 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
322b0 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20  s to be grouped 
322c0 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75  together as requ
322d0 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20  ired.    ** but 
322e0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72  not actually sor
322f0 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ted. Either way,
32300 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
32310 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
32320 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
32330 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61  OUP BY clauses a
32340 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73  re the same by s
32350 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72  etting the order
32360 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72  ByGrp.    ** var
32370 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
32380 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
32390 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70  stCompare(pGroup
323a0 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
323b0 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
323c0 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d      orderByGrp =
323d0 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20   1;.    }. .    
323e0 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
323f0 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
32400 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
32410 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
32420 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
32430 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
32440 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
32450 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
32460 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
32470 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
32480 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
32490 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
324a0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
324b0 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
324c0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
324d0 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
324e0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
324f0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
32500 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
32510 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
32520 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
32530 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
32540 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
32550 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
32560 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
32570 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
32580 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
32590 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
325a0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
325b0 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
325c0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
325d0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
325e0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
325f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
32600 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
32610 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
32620 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
32630 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
32640 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
32650 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
32660 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
32670 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
32680 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
32690 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
326a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
326b0 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
326c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
326d0 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
326e0 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
326f0 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
32700 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
32710 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
32720 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
32730 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
32740 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
32750 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
32760 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
32770 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
32780 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
32790 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
327a0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
327b0 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
327c0 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
327d0 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
327e0 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
327f0 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
32800 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
32810 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
32820 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
32830 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
32840 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
32850 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
32860 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
32870 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
32880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
32890 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
328a0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
328b0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
328c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
328d0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
328e0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
328f0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
32900 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
32910 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
32920 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
32930 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
32940 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
32950 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
32960 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
32970 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
32980 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
32990 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
329a0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
329b0 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  end;.#if SELECTT
329c0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
329d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
329e0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
329f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
32a00 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
32a10 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
32a20 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67  p,("After aggreg
32a30 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  ate analysis:\n"
32a40 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
32a50 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
32a60 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
32a70 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32a80 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
32a90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
32aa0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32ab0 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d  ("agg-column[%d]
32ac0 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
32ad0 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
32ae0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69  gInfo.aCol[ii].i
32af0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
32b00 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
32b10 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  r(0, sAggInfo.aC
32b20 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  ol[ii].pExpr, 0)
32b30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32b40 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32b50 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b  gInfo.nFunc; ii+
32b60 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
32b70 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32b80 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d  agg-func[%d]: iM
32b90 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
32ba0 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
32bb0 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65  fo.aFunc[ii].iMe
32bc0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
32bd0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
32be0 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  0, sAggInfo.aFun
32bf0 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  c[ii].pExpr, 0);
32c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
32c10 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50  endif...    /* P
32c20 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
32c30 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
32c40 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
32c50 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
32c60 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
32c70 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
32c80 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
32c90 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
32ca0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
32cb0 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
32cc0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
32cd0 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
32ce0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
32cf0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
32d00 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
32d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
32d20 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
32d30 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
32d40 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
32d50 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
32d60 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
32d70 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
32d80 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
32d90 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
32da0 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
32db0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
32dc0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
32dd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
32de0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
32df0 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
32e00 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
32e10 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
32e20 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
32e30 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
32e40 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
32e50 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
32e60 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
32e70 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
32e80 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
32e90 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
32ea0 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
32eb0 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
32ec0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
32ed0 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
32ee0 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
32ef0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32f00 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
32f10 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
32f20 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
32f30 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
32f40 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
32f50 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
32f60 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
32f70 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
32f80 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
32f90 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
32fa0 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
32fb0 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
32fc0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
32fd0 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
32fe0 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
32ff0 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
33000 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
33010 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
33020 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
33030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
33040 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
33050 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
33060 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
33070 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
33080 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
33090 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
330a0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
330b0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
330c0 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
330d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
330e0 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
330f0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
33100 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
33110 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
33120 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
33130 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
33140 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
33150 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
33160 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
33170 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
33180 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
33190 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
331a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
331b0 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
331c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
331d0 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
331e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
331f0 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
33200 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
33210 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
33220 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
33230 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
33240 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
33250 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
33260 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
33270 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
33280 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
33290 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
332a0 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
332b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
332c0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
332d0 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
332e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
332f0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
33300 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
33310 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
33320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33330 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
33340 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
33350 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33360 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
33370 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
33380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33390 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
333a0 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
333b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
333c0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
333d0 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
333e0 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
333f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33400 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
33410 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
33420 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
33430 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
33440 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
33450 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
33460 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
33470 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
33480 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
33490 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
334a0 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
334b0 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
334c0 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
334d0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
334e0 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
334f0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
33500 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
33510 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
33520 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
33530 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
33540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
33550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33560 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
33570 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
33580 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t);.      SELECT
33590 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
335a0 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
335b0 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
335c0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
335d0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
335e0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
335f0 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
33600 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
33610 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
33620 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
33630 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
33640 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
33650 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
33660 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
33670 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
33680 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
33690 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
336a0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
336b0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
336c0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
336d0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
336e0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
336f0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
33700 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
33710 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
33720 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
33730 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
33740 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
33750 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
33760 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
33770 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
33780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
33790 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
337a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
337b0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
337c0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
337d0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
337e0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
337f0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
33800 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
33810 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
33820 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
33830 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
33840 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
33850 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
33860 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
33870 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
33880 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
33890 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
338a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
338b0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
338c0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
338d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
338e0 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
338f0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
33900 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
33910 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
33920 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
33930 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
33940 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
33950 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33970 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
33980 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
33990 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
339a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
339b0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
339c0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
339d0 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
339e0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
339f0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
33a00 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
33a10 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
33a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
33a30 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
33a40 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
33a50 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
33a60 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
33a70 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
33a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
33a90 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
33aa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
33ab0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
33ac0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
33ad0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
33ae0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
33af0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
33b00 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
33b10 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
33b20 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
33b30 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
33b40 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
33b50 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
33b60 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
33b70 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
33b80 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
33b90 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
33ba0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
33bb0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
33bc0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
33bd0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
33be0 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
33bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
33c00 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
33c10 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
33c20 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
33c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c40 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
33c50 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
33c60 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
33c70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
33c80 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
33c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33ca0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
33cb0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
33cc0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
33cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33ce0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
33cf0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
33d00 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
33d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
33d20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
33d30 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
33d40 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
33d50 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
33d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
33d70 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
33d80 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
33d90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
33da0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
33db0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
33dc0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
33dd0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
33de0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
33df0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
33e00 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
33e10 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
33e20 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
33e30 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
33e40 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
33e50 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33e60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
33e70 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
33e80 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
33e90 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
33ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33eb0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
33ec0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
33ed0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
33ee0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
33ef0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
33f00 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
33f10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
33f20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
33f30 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
33f40 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
33f50 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
33f60 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
33f70 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
33f80 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
33f90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
33fa0 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
33fb0 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
33fc0 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
33fd0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
33fe0 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
33ff0 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
34000 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
34010 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
34020 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
34030 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
34040 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
34050 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
34060 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
34070 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
34080 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
34090 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
340a0 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
340b0 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
340c0 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
340d0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
340e0 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
340f0 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
34100 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
34110 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
34120 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
34130 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
34140 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
34150 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
34160 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
34170 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
34180 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
34190 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
341a0 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
341b0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
341c0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
341d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
341e0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
341f0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
34200 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34210 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
34220 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
34230 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
34240 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
34250 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
34260 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
34270 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
34280 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
34290 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
342a0 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
342b0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
342c0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
342d0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
342e0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
342f0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
34300 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
34310 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
34320 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
34330 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
34340 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
34350 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
34360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
34370 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
34380 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
34390 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
343a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
343b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
343c0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
343d0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
343e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343f0 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
34400 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
34410 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
34420 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
34430 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
34440 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
34450 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
34460 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34470 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
34480 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
34490 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
344a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
344b0 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
344c0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
344d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
344e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
344f0 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
34500 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
34510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34520 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34530 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
34540 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
34550 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
34560 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
34570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
34580 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
34590 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
345a0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
345b0 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
345c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
345d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
345e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
345f0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
34600 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31  r1+1, 0, addr1+1
34610 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34620 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
34630 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
34640 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
34650 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
34660 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
34670 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
34680 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
34690 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
346a0 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
346b0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
346c0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
346d0 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
346e0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
346f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
34700 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
34710 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
34720 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
34730 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
34740 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
34750 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
34760 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
34770 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
34780 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
34790 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
347a0 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
347b0 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
347c0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
347d0 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
347e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
347f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
34800 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
34810 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
34820 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
34830 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34840 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
34850 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
34860 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
34870 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34880 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
34890 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
348a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
348b0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
348c0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
348d0 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
348e0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
348f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
34900 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
34910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34930 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
34940 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
34950 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34960 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
34970 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
34980 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
34990 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
349a0 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
349b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
349c0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
349d0 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
349e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
349f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34a00 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
34a10 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
34a20 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
34a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34a40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
34a50 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
34a60 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
34a70 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
34a80 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
34a90 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
34aa0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
34ab0 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
34ac0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
34ad0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
34ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34af0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
34b00 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
34b10 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
34b20 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
34b30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
34b40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
34b60 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
34b70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34b80 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
34b90 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
34ba0 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
34bb0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
34bc0 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
34bd0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
34be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34bf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
34c00 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
34c10 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
34c20 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34c30 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
34c40 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
34c50 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
34c60 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
34c70 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
34c80 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
34c90 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
34ca0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
34cb0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
34cc0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
34cd0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
34ce0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
34cf0 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
34d00 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
34d10 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
34d20 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
34d30 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
34d40 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
34d50 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
34d60 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
34d70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
34d80 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
34d90 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
34da0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
34db0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
34dc0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
34dd0 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
34de0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
34df0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
34e00 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
34e10 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
34e20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
34e30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34e40 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
34e50 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
34e60 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
34e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34e80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34e90 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
34ea0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
34eb0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
34ec0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
34ed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34ee0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
34ef0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
34f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34f10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
34f20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
34f30 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
34f40 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
34f50 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
34f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
34f70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
34f80 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
34f90 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
34fa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
34fb0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
34fc0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34fd0 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
34fe0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
34ff0 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
35000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35010 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
35020 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
35030 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
35040 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
35050 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
35060 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
35070 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
35080 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
35090 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
350a0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
350b0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
350c0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
350d0 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
350e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350f0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
35100 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
35110 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
35120 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
35130 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
35140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
35150 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
35160 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
35170 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
35180 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
35190 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
351a0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
351b0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
351c0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
351d0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
351e0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
351f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
35200 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35210 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
35220 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
35230 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
35240 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
35250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35260 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
35270 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
35280 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
35290 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
352a0 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
352b0 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
352c0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
352d0 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66    else {.#ifndef
352e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
352f0 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
35300 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
35310 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
35320 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
35330 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
35340 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
35350 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
35360 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
35370 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
35380 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
35390 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
353a0 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
353b0 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
353c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
353d0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
353e0 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
353f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
35400 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
35410 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
35420 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
35430 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
35440 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
35450 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
35460 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
35470 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
35480 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
35490 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
354a0 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
354b0 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
354c0 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
354d0 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
354e0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
354f0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
35500 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
35510 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
35520 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
35530 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
35540 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
35550 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
35560 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
35570 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
35580 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
35590 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
355a0 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
355b0 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
355c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
355d0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
355e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
355f0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
35600 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
35610 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
35620 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
35630 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
35640 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
35650 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
35660 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
35670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35680 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
35690 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
356a0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
356b0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
356c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
356d0 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
356e0 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
356f0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
35700 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
35710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
35720 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
35730 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
35740 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
35750 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
35760 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
35770 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
35780 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
35790 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
357a0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
357b0 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
357c0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
357d0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
357e0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
357f0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
35800 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
35810 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
35820 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
35830 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
35840 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
35850 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
35860 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
35870 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
35880 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
35890 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
358a0 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
358b0 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
358c0 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
358d0 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
358e0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
358f0 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
35900 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35910 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
35920 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
35930 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
35940 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
35950 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
35960 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35970 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
35980 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
35990 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
359a0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
359b0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
359c0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
359d0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
359e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
359f0 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
35a00 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
35a10 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
35a20 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
35a30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
35a40 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
35a50 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
35a60 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
35a70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
35a80 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
35a90 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
35aa0 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
35ab0 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
35ac0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35ad0 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
35ae0 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
35af0 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
35b00 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
35b10 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
35b20 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
35b30 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
35b40 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
35b50 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
35b60 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
35b70 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
35b80 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
35b90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
35ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
35bb0 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
35bc0 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
35bd0 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
35be0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
35bf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35c00 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
35c10 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
35c20 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
35c30 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
35c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35c50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
35c60 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
35c70 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
35c80 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
35c90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
35ca0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
35cb0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
35cc0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
35cd0 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
35ce0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
35cf0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
35d00 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
35d10 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
35d20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
35d30 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
35d40 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
35d50 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
35d60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
35d70 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
35d80 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
35d90 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
35da0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
35db0 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
35dc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35dd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
35de0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
35df0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
35e00 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
35e10 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20  AggInfo);..     
35e20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75     /* If this qu
35e30 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
35e40 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
35e50 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
35e60 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
35e70 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c   minMaxFlag will
35e80 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
35e90 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74  ously set to eit
35ea0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  her.        ** W
35eb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
35ec0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
35ed0 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61  Y_MAX and pMinMa
35ee0 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20  xOrderBy will.  
35ef0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61        ** be an a
35f00 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52  ppropriate ORDER
35f10 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66   BY expression f
35f20 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
35f30 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
35f40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35f50 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
35f60 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
35f70 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72   || pMinMaxOrder
35f80 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By!=0 );.       
35f90 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
35fa0 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d  OrderBy==0 || pM
35fb0 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45  inMaxOrderBy->nE
35fc0 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  xpr==1 );..     
35fd0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
35fe0 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
35ff0 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
36000 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
36010 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
36020 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
36030 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61  , pWhere, pMinMa
36040 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  xOrderBy,.      
36050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36060 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
36070 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a  minMaxFlag, 0);.
36080 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
36090 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
360a0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
360b0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
360c0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
360d0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
360e0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
360f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
36100 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
36110 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
36120 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36130 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
36140 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
36150 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
36160 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36170 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
36180 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
36190 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d      (minMaxFlag=
361a0 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
361b0 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
361c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
361d0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
361e0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
361f0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
36200 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
36210 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
36220 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
36230 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
36240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
36250 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
36260 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
36270 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
36280 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
36290 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
362a0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c  Parse, p, -1, 0,
362b0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
362c0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
362d0 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
362e0 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
362f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
36300 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
36310 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
36320 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
36330 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
36340 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
36350 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
36360 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
36370 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
36380 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
36390 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
363a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
363b0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
363c0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
363d0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
363e0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
363f0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
36400 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
36410 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
36420 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
36430 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
36440 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36460 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
36470 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
36480 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
36490 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
364a0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
364b0 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
364c0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
364d0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
364e0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
364f0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
36500 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
36510 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36520 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
36530 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
36540 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
36550 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
36560 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
36570 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
36580 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
36590 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
365a0 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
365b0 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
365c0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
365d0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
365e0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
365f0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
36600 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
36610 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
36620 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
36630 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
36640 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
36650 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
36660 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
36670 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
36680 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
36690 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  b, pMinMaxOrderB
366a0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  y);.  sqlite3DbF
366b0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
366c0 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
366d0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
366e0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
366f0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
36700 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
36710 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
36720 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
36730 22 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  "));.#endif.  re
36740 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.