/ Hex Artifact Content
Login

Artifact 3e84cb869930aa8fcacd3acbb1a0ec2d82736c8479d6a4367a5f1a926fb8a763:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 70 3a 20 22 2c 28 53 29 2d 3e 7a  "%s/%p: ",(S)->z
02c0: 53 65 6c 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20  SelName,(S)),\. 
02d0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
02e0: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
02f0: 64 65 66 69 6e 65 20 53 45 4c 45 43 54 54 52 41  define SELECTTRA
0300: 43 45 28 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64  CE(K,P,S,X).#end
0310: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  if.../*.** An in
0320: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0330: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0340: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0350: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0360: 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f  ut.** how to pro
0370: 63 65 73 73 20 74 68 65 20 44 49 53 54 49 4e 43  cess the DISTINC
0380: 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69  T keyword, to si
0390: 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74  mplify passing t
03a0: 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  hat information.
03b0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65  ** into the sele
03c0: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f  ctInnerLoop() ro
03d0: 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  utine..*/.typede
03e0: 66 20 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  f struct Distinc
03f0: 74 43 74 78 20 44 69 73 74 69 6e 63 74 43 74 78  tCtx DistinctCtx
0400: 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69 6e 63  ;.struct Distinc
0410: 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e  tCtx {.  u8 isTn
0420: 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ct;      /* True
0430: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
0440: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0450: 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63  ent */.  u8 eTnc
0460: 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20  tType;   /* One 
0470: 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44 49 53  of the WHERE_DIS
0480: 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72  TINCT_* operator
0490: 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e  s */.  int tabTn
04a0: 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65  ct;    /* Epheme
04b0: 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66  ral table used f
04c0: 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  or DISTINCT proc
04d0: 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  essing */.  int 
04e0: 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41  addrTnct;   /* A
04f0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65  ddress of OP_Ope
0500: 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64  nEphemeral opcod
0510: 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f  e for tabTnct */
0520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0530: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0540: 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69  llowing object i
0550: 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64  s used to record
0560: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
0570: 75 74 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  ut.** the ORDER 
0580: 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
0590: 20 63 6c 61 75 73 65 20 6f 66 20 71 75 65 72 79   clause of query
05a0: 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64 2e   is being coded.
05b0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
05c0: 63 74 20 53 6f 72 74 43 74 78 20 53 6f 72 74 43  ct SortCtx SortC
05d0: 74 78 3b 0a 73 74 72 75 63 74 20 53 6f 72 74 43  tx;.struct SortC
05e0: 74 78 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  tx {.  ExprList 
05f0: 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
0600: 54 68 65 20 4f 52 44 45 52 20 42 59 20 28 6f 72  The ORDER BY (or
0610: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
0620: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61  ) */.  int nOBSa
0630: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
0640: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
0650: 42 59 20 74 65 72 6d 73 20 73 61 74 69 73 66 69  BY terms satisfi
0660: 65 64 20 62 79 20 69 6e 64 69 63 65 73 20 2a 2f  ed by indices */
0670: 0a 20 20 69 6e 74 20 69 45 43 75 72 73 6f 72 3b  .  int iECursor;
0680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0690: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
06a0: 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  e sorter */.  in
06b0: 74 20 72 65 67 52 65 74 75 72 6e 3b 20 20 20 20  t regReturn;    
06c0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
06d0: 68 6f 6c 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75  holding block-ou
06e0: 74 70 75 74 20 72 65 74 75 72 6e 20 61 64 64 72  tput return addr
06f0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ess */.  int lab
0700: 65 6c 42 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f  elBkOut;       /
0710: 2a 20 53 74 61 72 74 20 6c 61 62 65 6c 20 66 6f  * Start label fo
0720: 72 20 74 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70  r the block-outp
0730: 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
0740: 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
0750: 6e 64 65 78 3b 20 20 20 20 2f 2a 20 41 64 64 72  ndex;    /* Addr
0760: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f  ess of the OP_So
0770: 72 74 65 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f  rterOpen or OP_O
0780: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  penEphemeral */.
0790: 20 20 69 6e 74 20 6c 61 62 65 6c 44 6f 6e 65 3b    int labelDone;
07a0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
07b0: 68 65 72 65 20 77 68 65 6e 20 64 6f 6e 65 2c 20  here when done, 
07c0: 65 78 3a 20 4c 49 4d 49 54 20 72 65 61 63 68 65  ex: LIMIT reache
07d0: 64 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74 46 6c  d */.  u8 sortFl
07e0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ags;         /* 
07f0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 4f 52  Zero or more SOR
0800: 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a 2f 0a  TFLAG_* bits */.
0810: 20 20 75 38 20 62 4f 72 64 65 72 65 64 49 6e 6e    u8 bOrderedInn
0820: 65 72 4c 6f 6f 70 3b 20 2f 2a 20 4f 52 44 45 52  erLoop; /* ORDER
0830: 20 42 59 20 63 6f 72 72 65 63 74 6c 79 20 73 6f   BY correctly so
0840: 72 74 73 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  rts the inner lo
0850: 6f 70 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  op */.};.#define
0860: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0870: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0880: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0890: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
08a0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
08b0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
08c0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
08d0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
08e0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
08f0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0900: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0910: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0920: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0930: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0940: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0950: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0960: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0970: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0980: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0990: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
09a0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
09b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
09c0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09d0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
09e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
09f0: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0a00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0a10: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0a20: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0a30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0a40: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0a70: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0a80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0a90: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0aa0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ab0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ac0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ad0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ae0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0af0: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0b00: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0b10: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0b20: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0b40: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0b50: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0b60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0b70: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0b80: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0b90: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0ba0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0bb0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0bc0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0bd0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0be0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
0bf0: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
0c00: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0c10: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
0c20: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
0c30: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
0c40: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
0c50: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
0c60: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
0c70: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
0c80: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
0c90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
0cb0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0cc0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
0cd0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
0ce0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
0cf0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
0d00: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
0d10: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
0d20: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
0d30: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
0d40: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
0d50: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
0d60: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
0d70: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
0d80: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
0d90: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
0da0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0db0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
0dc0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
0dd0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
0de0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
0df0: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
0e00: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
0e10: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
0e20: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
0e30: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
0e40: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
0e50: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
0e60: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
0e70: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
0e80: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
0e90: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
0ea0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
0eb0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
0ec0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
0ed0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
0ee0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
0ef0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
0f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
0f10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
0f20: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f30: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
0f40: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
0f50: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
0f60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0f70: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
0f80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
0fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
0fc0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
0fd0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
0fe0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
0ff0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1000: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1010: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1020: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1030: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1040: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1050: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1060: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1070: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1080: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
1090: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
10a0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
10b0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
10c0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
10d0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
10e0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
10f0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1100: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1110: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1120: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1130: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1140: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1150: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1160: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1170: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1180: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
1190: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11a0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
11b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
11c0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
11d0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11e0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
11f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
1200: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1210: 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c  ) {.    clearSel
1220: 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ect(pParse->db, 
1230: 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61  pNew, pNew!=&sta
1240: 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20  ndin);.    pNew 
1250: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1260: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1270: 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73  pSrc!=0 || pPars
1280: 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d  e->nErr>0 );.  }
1290: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21  .  assert( pNew!
12a0: 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72  =&standin );.  r
12b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23  eturn pNew;.}..#
12c0: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
12d0: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74  NABLED./*.** Set
12e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53   the name of a S
12f0: 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  elect object.*/.
1300: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1310: 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74  ctSetName(Select
1320: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1330: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70  *zName){.  if( p
1340: 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20   && zName ){.   
1350: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1360: 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c  f(sizeof(p->zSel
1370: 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61  Name), p->zSelNa
1380: 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29  me, "%s", zName)
1390: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
13a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
13b0: 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73  e given Select s
13c0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
13d0: 20 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63   of its substruc
13e0: 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tures..*/.void s
13f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1400: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1410: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
1420: 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
1430: 52 55 45 28 70 29 20 29 20 63 6c 65 61 72 53 65  RUE(p) ) clearSe
1440: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1450: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1460: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1470: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1480: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1490: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
14a0: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
14b0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
14c0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
14d0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
14e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
14f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1500: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1510: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1520: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1530: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1540: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1550: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1560: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1570: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1580: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1590: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
15a0: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
15b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
15c0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
15d0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
15e0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
15f0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
1600: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1610: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1620: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1630: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1640: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1650: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1660: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1670: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1680: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1690: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
16a0: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
16b0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
16c0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
16d0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
16e0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
16f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1700: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1710: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1720: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1730: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1740: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1750: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1780: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1790: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
17a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
17b0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
17c0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
17d0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
17e0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
17f0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
1800: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1810: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1820: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1830: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1840: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1850: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1860: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1870: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1880: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1890: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
18a0: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
18b0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
18c0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
18d0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
18e0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
18f0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
1900: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1910: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1920: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1930: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1940: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1950: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1960: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1970: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1980: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1990: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
19a0: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
19b0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
19c0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
19d0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
19e0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a00: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1a10: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1a20: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1a30: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1a40: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1a50: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1a60: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1a70: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1a80: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1a90: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1aa0: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ab0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1ac0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1ad0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1ae0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1af0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1b00: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1b10: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1b20: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1b30: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1b40: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1b50: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1b60: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1b70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1ba0: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1bb0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1bc0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1bd0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1be0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1bf0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1c00: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1c10: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1c20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1c30: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1c40: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1c50: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1c60: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1c70: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1c80: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1c90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1ca0: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1cb0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1cc0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1cd0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1ce0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1cf0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1d00: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1d10: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1d20: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1d30: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1d40: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1d50: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1d60: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1d70: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1d80: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1d90: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1da0: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1db0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1dc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1dd0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1de0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1df0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1e00: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1e10: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1e20: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1e30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1e40: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1e50: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1e60: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1e70: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1e80: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1e90: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1ea0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1eb0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ec0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1ed0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1ee0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1ef0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1f00: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1f10: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1f20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1f30: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1f40: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1f50: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1f60: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
1f70: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
1f80: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
1f90: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
1fa0: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
1fb0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
1fc0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
1fd0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
1fe0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
1ff0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
2000: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2010: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2020: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2030: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2040: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2050: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2060: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2070: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2080: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2090: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
20a0: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
20b0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
20c0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
20d0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
20e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20f0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
2100: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2110: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2120: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2130: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2140: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2150: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2160: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2170: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2180: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2190: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
21a0: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
21b0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
21c0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
21d0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
21e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2200: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2210: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2220: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2240: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2250: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2260: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2270: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2280: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2290: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
22a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
22b0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
22c0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
22d0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
22e0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
22f0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
2300: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2310: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2320: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2330: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2340: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2360: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2370: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2380: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2390: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
23a0: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
23b0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
23c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
23d0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
23e0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
23f0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
2400: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2410: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2420: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2430: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2440: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2450: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2460: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2470: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2480: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2490: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
24a0: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
24b0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
24c0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
24d0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
24e0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
24f0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
2500: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2510: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2520: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2540: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2550: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2560: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2570: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2580: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2590: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
25a0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
25b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
25c0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
25d0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
25e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
25f0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
2600: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2610: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2620: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2630: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2650: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2660: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2670: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2690: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
26a0: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
26b0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
26c0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
26d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
26f0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
2700: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2730: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2740: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2750: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2760: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2770: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2780: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2790: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
27a0: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
27b0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
27c0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
27d0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
27e0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
27f0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
2800: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2810: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2820: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2830: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2840: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2850: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2860: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2870: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2880: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2890: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28a0: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
28b0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
28c0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
28d0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
28e0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
28f0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2900: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2910: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2920: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2930: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2940: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2950: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2960: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2970: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2980: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2990: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
29a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
29b0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
29c0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
29d0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
29e0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
29f0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2a00: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2a10: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2a20: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2a30: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2a40: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2a50: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2a60: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2a70: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2a80: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2a90: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2aa0: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ab0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2ac0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2ad0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2ae0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2af0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2b00: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2b10: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2b20: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2b30: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2b40: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2b50: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2b60: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2b70: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2b80: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2b90: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2ba0: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2bb0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2bc0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2bd0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2be0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2c00: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2c10: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2c20: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2c30: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2c40: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2c50: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2c60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2c70: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2c80: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2c90: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2ca0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2cb0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2cc0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2cd0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2ce0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2d00: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2d10: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2d20: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2d30: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2d40: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2d50: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2d60: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2d70: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2d80: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2d90: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2da0: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2db0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2dc0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2dd0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2de0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2df0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2e00: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2e10: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2e20: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2e30: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2e40: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2e50: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2e60: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2e70: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2e80: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2e90: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2ea0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2eb0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2ec0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2ed0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2ee0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2ef0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2f00: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
2f10: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2f20: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
2f30: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
2f40: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2f50: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
2f60: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
2f70: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
2f80: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
2f90: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
2fa0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2fb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2fc0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2fd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2fe0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
2ff0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
3000: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3020: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3030: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3040: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3050: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f  .  } .}../* Undo
3060: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74   the work of set
3070: 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20  JoinExpr().  In 
3080: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
3090: 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65  ree p, convert e
30a0: 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61  very.** term tha
30b0: 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  t is marked with
30c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64   EP_FromJoin and
30d0: 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65   iRightJoinTable
30e0: 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a  ==iTable into.**
30f0: 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72   an ordinary ter
3100: 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65  m that omits the
3110: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72   EP_FromJoin mar
3120: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61  k..**.** This ha
3130: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46  ppens when a LEF
3140: 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69  T JOIN is simpli
3150: 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64  fied into an ord
3160: 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73  inary JOIN..*/.s
3170: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74  tatic void unset
3180: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
3190: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
31a0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
31b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
31c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
31d0: 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54  oin).     && (iT
31e0: 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69  able<0 || p->iRi
31f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54  ghtJoinTable==iT
3200: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45  able) ){.      E
3210: 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
3220: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
3230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3240: 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  p->op==TK_FUNCTI
3250: 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74  ON && p->x.pList
3260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
3270: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
3280: 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  i<p->x.pList->nE
3290: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
32a0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
32b0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69  (p->x.pList->a[i
32c0: 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29  ].pExpr, iTable)
32d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32e0: 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
32f0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  r(p->pLeft, iTab
3300: 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  le);.    p = p->
3310: 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a  pRight;.  } .}..
3320: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3330: 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65  ne processes the
3340: 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   join informatio
3350: 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73  n for a SELECT s
3360: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20  tatement..** ON 
3370: 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
3380: 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  s are converted 
3390: 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73  into extra terms
33a0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
33b0: 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c  ause..** NATURAL
33c0: 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61   joins also crea
33d0: 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63  te extra WHERE c
33e0: 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a  lause terms..**.
33f0: 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20  ** The terms of 
3400: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72  a FROM clause ar
3410: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
3420: 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73  he Select.pSrc s
3430: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65  tructure..** The
3440: 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65   left most table
3450: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e   is the first en
3460: 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53  try in Select.pS
3470: 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rc.  The right-m
3480: 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  ost.** table is 
3490: 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20  the last entry. 
34a0: 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   The join operat
34b0: 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  or is held in th
34c0: 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  e entry to.** th
34d0: 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e  e left.  Thus en
34e0: 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74  try 0 contains t
34f0: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
3500: 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65   for the join be
3510: 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73  tween.** entries
3520: 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f   0 and 1.  Any O
3530: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3540: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3550: 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a  th the join are.
3560: 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64  ** also attached
3570: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74   to the left ent
3580: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
3590: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
35a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
35b0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ors encountered.
35c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
35d0: 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
35e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
35f0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72  Select *p){.  Sr
3600: 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3620: 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74   All tables in t
3630: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
3640: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
3670: 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ters */.  struct
3680: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3690: 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66  Left;     /* Lef
36a0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
36b0: 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ined */.  struct
36c0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
36d0: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67  Right;    /* Rig
36e0: 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ht table being j
36f0: 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63  oined */..  pSrc
3700: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c   = p->pSrc;.  pL
3710: 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30  eft = &pSrc->a[0
3720: 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70  ];.  pRight = &p
3730: 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Left[1];.  for(i
3740: 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
3750: 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b  -1; i++, pRight+
3760: 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20  +, pLeft++){.   
3770: 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61   Table *pRightTa
3780: 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62  b = pRight->pTab
3790: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65  ;.    int isOute
37a0: 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45  r;..    if( NEVE
37b0: 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30  R(pLeft->pTab==0
37c0: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
37d0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
37e0: 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69    isOuter = (pRi
37f0: 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  ght->fg.jointype
3800: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b   & JT_OUTER)!=0;
3810: 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68  ..    /* When th
3820: 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
3830: 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64  d is present, ad
3840: 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  d WHERE clause t
3850: 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erms for.    ** 
3860: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61  every column tha
3870: 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  t the two tables
3880: 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e   have in common.
3890: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
38a0: 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74  pRight->fg.joint
38b0: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
38c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52   ){.      if( pR
38d0: 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69  ight->pOn || pRi
38e0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
38f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3900: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3910: 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d  a NATURAL join m
3920: 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20  ay not have ".  
3930: 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20           "an ON 
3940: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22  or USING clause"
3950: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 0);.        re
3960: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3970: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
3980: 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c  <pRightTab->nCol
3990: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
39a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f  char *zName;   /
39b0: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e  * Name of column
39c0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   in the right ta
39d0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
39e0: 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a  nt iLeft;     /*
39f0: 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74   Matching left t
3a00: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
3a10: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f  int iLeftCol;  /
3a20: 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  * Matching colum
3a30: 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61  n in the left ta
3a40: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ble */..        
3a50: 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61  zName = pRightTa
3a60: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
3a70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61  ;.        if( ta
3a80: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
3a90: 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61  x(pSrc, i+1, zNa
3aa0: 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65  me, &iLeft, &iLe
3ab0: 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  ftCol) ){.      
3ac0: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3ad0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69  (pParse, pSrc, i
3ae0: 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20  Left, iLeftCol, 
3af0: 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20  i+1, j,.        
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3b10: 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65  sOuter, &p->pWhe
3b20: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
3b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
3b40: 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f    /* Disallow bo
3b50: 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  th ON and USING 
3b60: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3b70: 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a  ame join.    */.
3b80: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
3b90: 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70  pOn && pRight->p
3ba0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  Using ){.      s
3bb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3bc0: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68  Parse, "cannot h
3bd0: 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20  ave both ON and 
3be0: 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20  USING ".        
3bf0: 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20  "clauses in the 
3c00: 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20  same join");.   
3c10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3c20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74   }..    /* Add t
3c30: 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20  he ON clause to 
3c40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
3c50: 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e  HERE clause, con
3c60: 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a  nected by.    **
3c70: 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72   an AND operator
3c80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3c90: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a   pRight->pOn ){.
3ca0: 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65        if( isOute
3cb0: 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  r ) setJoinExpr(
3cc0: 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69  pRight->pOn, pRi
3cd0: 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  ght->iCursor);. 
3ce0: 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d       p->pWhere =
3cf0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
3d00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
3d10: 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70  Where, pRight->p
3d20: 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68  On);.      pRigh
3d30: 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20  t->pOn = 0;.    
3d40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
3d50: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
3d60: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3d70: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
3d80: 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e   named.    ** in
3d90: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
3da0: 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20  e.  Example: If 
3db0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74  the two tables t
3dc0: 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20  o be joined are 
3dd0: 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20  .    ** A and B 
3de0: 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c  and the USING cl
3df0: 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c  ause names X, Y,
3e00: 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64   and Z, then add
3e10: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20   this.    ** to 
3e20: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3e30: 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44  :    A.X=B.X AND
3e40: 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a   A.Y=B.Y AND A.Z
3e50: 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f  =B.Z.    ** Repo
3e60: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  rt an error if a
3e70: 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f  ny column mentio
3e80: 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ned in the USING
3e90: 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a   clause is.    *
3ea0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  * not contained 
3eb0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74  in both tables t
3ec0: 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20  o be joined..   
3ed0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3ee0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3ef0: 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73      IdList *pLis
3f00: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69  t = pRight->pUsi
3f10: 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ng;.      for(j=
3f20: 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; j<pList->nId;
3f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3f40: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
3f50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
3f60: 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47  erm in the USING
3f70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
3f80: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3f90: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20      /* Table on 
3fa0: 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61  the left with ma
3fb0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
3fc0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
3fd0: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f  t iLeftCol;    /
3fe0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3ff0: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
4000: 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  mn on the left *
4010: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  /.        int iR
4020: 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f  ightCol;   /* Co
4030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d  lumn number of m
4040: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f  atching column o
4050: 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a  n the right */..
4060: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
4070: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
4080: 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68  e;.        iRigh
4090: 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  tCol = columnInd
40a0: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
40b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
40c0: 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20  ( iRightCol<0.  
40d0: 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65         || !table
40e0: 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
40f0: 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c  Src, i+1, zName,
4100: 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43   &iLeft, &iLeftC
4110: 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ol).        ){. 
4120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4140: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
4150: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
4160: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
4170: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
4180: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
4190: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
41a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
41b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
41c0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
41d0: 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66  arse, pSrc, iLef
41e0: 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31  t, iLeftCol, i+1
41f0: 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20  , iRightCol,.   
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70    isOuter, &p->p
4220: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Where);.      }.
4230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4240: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn 0;.}../* Forw
4250: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
4260: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
4270: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
4280: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
4290: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
42a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42b0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
42c0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
42d0: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
42e0: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
42f0: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
4300: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
4310: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
4320: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
4330: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
4340: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
4350: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
4360: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
4370: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a   the end */.);..
4380: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
4390: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
43a0: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
43b0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
43c0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
43d0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
43e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
43f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4400: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4410: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4420: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4430: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
4440: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
4450: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
4460: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
4470: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
4480: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4490: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
44a0: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
44b0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
44c0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
44d0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
44e0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
44f0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4500: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4510: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4520: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4530: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
4540: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
4550: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
4560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4570: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
4580: 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f  he data array */
4590: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
45a0: 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e  g         /* No.
45b0: 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f   of reg prior to
45c0: 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62   regData availab
45d0: 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b  le for use */.){
45e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
45f0: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65      /* Stmt unde
4620: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
4630: 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28  /.  int bSeq = (
4640: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
4650: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
4660: 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69  Sorter)==0);.  i
4670: 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74  nt nExpr = pSort
4680: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
4690: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
46a0: 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20  /* No. of ORDER 
46b0: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  BY terms */.  in
46c0: 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20  t nBase = nExpr 
46d0: 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20  + bSeq + nData; 
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46f0: 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74  * Fields in sort
4700: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4710: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74  /* Regs for sort
4750: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4760: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b  nt regRecord = +
4770: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20  +pParse->nMem;  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72  /* Assembled sor
47a0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
47b0: 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f  int nOBSat = pSo
47c0: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20  rt->nOBSat;     
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   /* ORDER BY ter
47f0: 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ms to skip */.  
4800: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20     /* Opcode to 
4830: 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72  add sorter recor
4840: 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20  d to sorter */. 
4850: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20   int iLimit;    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75      /* LIMIT cou
4880: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
4890: 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53  t( bSeq==0 || bS
48a0: 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  eq==1 );.  asser
48b0: 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72  t( nData==1 || r
48c0: 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44  egData==regOrigD
48d0: 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61  ata || regOrigDa
48e0: 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  ta==0 );.  if( n
48f0: 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20  PrefixReg ){.   
4900: 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78   assert( nPrefix
4910: 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20  Reg==nExpr+bSeq 
4920: 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  );.    regBase =
4930: 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72   regData - nExpr
4940: 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65   - bSeq;.  }else
4950: 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  {.    regBase = 
4960: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
4970: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
4980: 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d  em += nBase;.  }
4990: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
49a0: 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c  ct->iOffset==0 |
49b0: 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  | pSelect->iLimi
49c0: 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74  t!=0 );.  iLimit
49d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   = pSelect->iOff
49e0: 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69  set ? pSelect->i
49f0: 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65  Offset+1 : pSele
4a00: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53  ct->iLimit;.  pS
4a10: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d  ort->labelDone =
4a20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
4a30: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69  Label(v);.  sqli
4a40: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
4a50: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4a60: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67  t->pOrderBy, reg
4a70: 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74  Base, regOrigDat
4a80: 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
4aa0: 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28  ITE_ECEL_DUP | (
4ab0: 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c  regOrigData? SQL
4ac0: 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30  ITE_ECEL_REF : 0
4ad0: 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  ));.  if( bSeq )
4ae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4af0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4b00: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4b10: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4b20: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4b30: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4b40: 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20   && nData>0 ){. 
4b50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4b60: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
4b70: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
4b80: 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74  nExpr+bSeq, nDat
4b90: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
4ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4bb0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
4bc0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
4bd0: 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 52  ase-nOBSat, regR
4be0: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e 4f  ecord);.  if( nO
4bf0: 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  BSat>0 ){.    in
4c00: 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20  t regPrevKey;   
4c10: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42  /* The first nOB
4c20: 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  Sat columns of t
4c30: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
4c40: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46  */.    int addrF
4c50: 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72  irst;    /* Addr
4c60: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66  ess of the OP_If
4c70: 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  Not opcode */.  
4c80: 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20    int addrJmp;  
4c90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4ca0: 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70  f the OP_Jump op
4cb0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65  code */.    Vdbe
4cc0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a  Op *pOp;      /*
4cd0: 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65   Opcode that ope
4ce0: 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  ns the sorter */
4cf0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20  .    int nKey;  
4d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4d10: 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20   of sorting key 
4d20: 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69  columns, includi
4d30: 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a  ng OP_Sequence *
4d40: 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
4d50: 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  KI;     /* Origi
4d60: 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74  nal KeyInfo on t
4d70: 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20  he sorter table 
4d80: 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76 4b  */..    regPrevK
4d90: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
4da0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
4db0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
4dc0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
4dd0: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
4de0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
4df0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
4e00: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
4e10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
4e20: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
4e30: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4e40: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
4e50: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
4e60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e70: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
4e80: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
4e90: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
4ea0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
4eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ec0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
4ed0: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
4ee0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
4ef0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
4f00: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
4f10: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
4f20: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
4f30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
4f40: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4f50: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
4f60: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
4f70: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
4f80: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
4f90: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
4fa0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
4fb0: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
4fc0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
4fd0: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
4fe0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
4ff0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5000: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
5010: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
5020: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
5030: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5040: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5050: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5060: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
5070: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5080: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5090: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
50d0: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
50e0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
50f0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
5100: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
5110: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5120: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
5130: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
5140: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
5150: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5160: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5170: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5180: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5190: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
51a0: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
51b0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
51c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
51d0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
51e0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
51f0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
5200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5210: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5220: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5230: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5240: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5260: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5270: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5280: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5290: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
52a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
52b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
52c0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
52d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
52e0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
52f0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
5300: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5320: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5330: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5340: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5350: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5360: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5370: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5380: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5390: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
53a0: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
53b0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
53c0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
53d0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
53e0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
53f0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
5400: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5410: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5420: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5430: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5440: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5450: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5460: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5470: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5480: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5490: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
54a0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
54b0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
54c0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
54d0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
54e0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
54f0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
5500: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5510: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5520: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5530: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5540: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5550: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5560: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5570: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5580: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5590: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
55a0: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
55b0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
55c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
55d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
55e0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
55f0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
5600: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5610: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5620: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5630: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5640: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5650: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5660: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5670: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5680: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5690: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
56a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56b0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
56c0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
56d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
56e0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
56f0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
5700: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5710: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5720: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5730: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5740: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5750: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5760: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5770: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5780: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5790: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
57a0: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
57b0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
57c0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
57d0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
57e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
57f0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
5800: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5810: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5820: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5830: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5840: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5850: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5860: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5890: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
58a0: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
58b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
58c0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
58d0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
58e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
58f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5900: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5910: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5920: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5930: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5940: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5950: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5960: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5970: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5980: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5990: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
59a0: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
59b0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
59c0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
59d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
59e0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
59f0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5a00: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5a10: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5a20: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a40: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5a50: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5a60: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5a70: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5a80: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5a90: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5aa0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
5ab0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
5ac0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
5ad0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
5ae0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
5af0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
5b00: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5b10: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5b20: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5b30: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5b40: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5b50: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5b60: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5b70: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5b80: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5b90: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5ba0: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
5bb0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
5bc0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
5bd0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
5be0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
5bf0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
5c00: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5c10: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5c20: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5c30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5c40: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5c50: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5c60: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5c70: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5c80: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5c90: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5ca0: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5cb0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5cc0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5cd0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ce0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5cf0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5d00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5d10: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5d20: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5d30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5d40: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5d50: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5d60: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5d70: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5d80: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d90: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5da0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5db0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5dc0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5dd0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5de0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5e00: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5e10: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5e30: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5e40: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5e50: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5e60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5e70: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5e80: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5e90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5ea0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5ec0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5ed0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5ee0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ef0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5f00: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5f10: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5f20: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5f30: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
5f40: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
5f50: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
5f60: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
5f70: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
5f80: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
5f90: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
5fa0: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
5fb0: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
5fc0: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
5fd0: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
5fe0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5ff0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
6000: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
6010: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
6020: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
6030: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
6040: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
6050: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
6060: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
6070: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
6080: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6090: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
60a0: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
60b0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
60c0: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
60d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
60e0: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
60f0: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
6100: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
6110: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
6120: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
6130: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
6140: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
6150: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
6160: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
6170: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
6180: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
6190: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
61a0: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
61b0: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
61c0: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
61d0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
61e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
61f0: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
6200: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
6210: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
6220: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
6230: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
6240: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
6250: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
6260: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
6270: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6280: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6290: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
62a0: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
62b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
62c0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
62d0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
62e0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
62f0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
6300: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
6310: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
6320: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
6330: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
6340: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
6350: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
6360: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
6370: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
6380: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6390: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
63a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
63b0: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
63c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
63d0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
63e0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
63f0: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
6400: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
6410: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
6420: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
6430: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
6440: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
6450: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
6460: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
6470: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
6480: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
6490: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
64a0: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
64b0: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
64c0: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
64d0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
64e0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
64f0: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
6500: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
6510: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
6520: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
6530: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
6540: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
6550: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
6560: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6580: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
6590: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
65a0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
65b0: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
65d0: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
65e0: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
65f0: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
6600: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
6610: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
6620: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
6630: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
6640: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
6650: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
6660: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
6670: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
6680: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
6690: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
66a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
66b0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
66c0: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
66d0: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
66e0: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
66f0: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
6700: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
6710: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
6720: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
6730: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
6740: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
6750: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
6760: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
6770: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
6780: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
6790: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
67a0: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
67b0: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
67c0: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
67d0: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
67e0: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
67f0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
6800: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
6810: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
6820: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
6830: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
6840: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6850: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
6860: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
6870: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
6880: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
6890: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
68a0: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
68b0: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
68c0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
68d0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
68e0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
68f0: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
6900: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
6910: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
6920: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
6930: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
6940: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
6950: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
6960: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
6970: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
6980: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
6990: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
69a0: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
69b0: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
69c0: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
69d0: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
69e0: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
69f0: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
6a00: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6a10: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
6a20: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
6a30: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
6a40: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
6a50: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6a60: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6a70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6a80: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6aa0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ab0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
6ac0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
6ad0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
6ae0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
6af0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
6b00: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6b10: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6b20: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6b30: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6b40: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6b50: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6b60: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6b70: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6b80: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
6b90: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
6ba0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
6bb0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
6bc0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
6bd0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
6be0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6bf0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6c00: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6c10: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6c20: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6c40: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6c50: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6c60: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6c70: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6c80: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6c90: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ca0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6cb0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6cc0: 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20   p->pEList that 
6cd0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20  is a copy of an 
6ce0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20  expression in.  
6cf0: 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52      ** the ORDER
6d00: 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72   BY clause (pSor
6d10: 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65  t->pOrderBy), se
6d20: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
6d30: 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65   .      ** iOrde
6d40: 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20  rByCol value to 
6d50: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  one more than th
6d60: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f  e index of the O
6d70: 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a  RDER BY .      *
6d80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  * expression wit
6d90: 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79  hin the sort-key
6da0: 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f   that pushOntoSo
6db0: 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65  rter() will gene
6dc0: 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rate..      ** T
6dd0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70  his allows the p
6de0: 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74  ->pEList field t
6df0: 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f  o be omitted fro
6e00: 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 63  m the sorted rec
6e10: 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61  ord,.      ** sa
6e20: 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43  ving space and C
6e30: 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20  PU cycles.  */. 
6e40: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c       ecelFlags |
6e50: 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f  = (SQLITE_ECEL_O
6e60: 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43  MITREF|SQLITE_EC
6e70: 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66  EL_REF);.      f
6e80: 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53  or(i=pSort->nOBS
6e90: 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72  at; i<pSort->pOr
6ea0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
6eb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
6ec0: 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  j;.        if( (
6ed0: 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  j = pSort->pOrde
6ee0: 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
6ef0: 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a  rderByCol)>0 ){.
6f00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c            p->pEL
6f10: 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e  ist->a[j-1].u.x.
6f20: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b  iOrderByCol = i+
6f30: 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  1-pSort->nOBSat;
6f40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6f50: 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69 67   }.      regOrig
6f60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
6f70: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
6f80: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
6f90: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
6fa0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
6fb0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
6fc0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73 75  .    }.    nResu
6fe0: 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 45  ltCol = sqlite3E
6ff0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
7000: 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73 74  pParse,p->pEList
7010: 2c 72 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20  ,regResult,.    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 30 2c 65 63 65 6c 46 6c 61 67 73       0,ecelFlags
7050: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
7060: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
7070: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
7080: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
7090: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
70a0: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
70b0: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
70c0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
70d0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
70e0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
70f0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
7100: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
7110: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
7120: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
7130: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
7140: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
7150: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
7160: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
7170: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
7180: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
7190: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
71a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
71b0: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
71c0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
71d0: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
71e0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7200: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
7210: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
7220: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
7230: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
7240: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
7250: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
7260: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7270: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
7280: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
7290: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
72a0: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
72b0: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
72c0: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
72d0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
72e0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
72f0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
7300: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
7310: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7320: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
7330: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
7340: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
7350: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
7360: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
7370: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
7380: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
7390: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
73a0: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
73b0: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
73c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
73d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
73e0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
73f0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
7400: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
7410: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
7420: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7430: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7440: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
7450: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
7460: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
7470: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
7480: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
7490: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
74a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74b0: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
74c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
74d0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
74e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
74f0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
7500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
7510: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
7520: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7530: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
7540: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
7550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7570: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
7580: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
7590: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
75a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
75b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
75c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
75d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
75e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
75f0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
7600: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
7610: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
7620: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
7640: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7650: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
7660: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
7670: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
7680: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
76a0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
76b0: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
76c0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
76d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
76e0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
76f0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
7700: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7720: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7730: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
7740: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
7750: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
7760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7770: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
7780: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
7790: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
77a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
77b0: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
77c0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
77d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
77e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
77f0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
7800: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
7810: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
7820: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
7830: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
7840: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
7850: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
7860: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
7870: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
7880: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
7890: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
78a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
78b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
78c0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
78d0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
78e0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
78f0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
7900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
7910: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
7920: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
7930: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
7940: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
7950: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
7960: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
7970: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
7980: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7990: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
79a0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
79b0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
79c0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
79d0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
79e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
79f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7a00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7a10: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7a20: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7a30: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
7a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7a50: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
7a60: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
7a70: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7a80: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
7a90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7aa0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
7ab0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ac0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
7ad0: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
7ae0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
7af0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
7b00: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
7b10: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
7b20: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
7b30: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
7b40: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
7b50: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
7b60: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
7b70: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
7b80: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
7b90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ba0: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
7bb0: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
7bc0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7be0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7bf0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7c00: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
7c10: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
7c20: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
7c30: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
7c40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7c50: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7c60: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7c70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7c80: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7c90: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7ca0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7cc0: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7cd0: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7ce0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7cf0: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
7d00: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7d10: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
7d20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7d30: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
7d40: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
7d50: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7d60: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
7d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
7d90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
7da0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
7db0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
7dc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7dd0: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7de0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7df0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7e00: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7e10: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7e20: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7e30: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7e40: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7e50: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7e60: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
7e70: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
7e80: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
7e90: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
7ea0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
7eb0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
7ec0: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7ed0: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7ee0: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7ef0: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7f00: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7f10: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7f20: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7f30: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7f40: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7f50: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7f60: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
7f70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f80: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7f90: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
7fa0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
7fb0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
7fc0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
7fd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7fe0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
7ff0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
8000: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
8010: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8020: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
8030: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
8040: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
8050: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
8060: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
8070: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8080: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 72 65 67  1+nPrefixReg,reg
8090: 52 65 73 75 6c 74 2c 31 2c 6e 50 72 65 66 69 78  Result,1,nPrefix
80a0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
80b0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
80c0: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
80d0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
80e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
80f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
8100: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
8110: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
8120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8130: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
8140: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
8150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8160: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8170: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8180: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8190: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
81a0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
81b0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
81c0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
81d0: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
81e0: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
81f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
8200: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8210: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
8220: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
8230: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
8240: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
8250: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
8260: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
8270: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
8280: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
8290: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
82a0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
82b0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
82c0: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
82d0: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
82e0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
82f0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74  .      if( pSort
8300: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
8310: 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79  t first glance y
8320: 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77  ou would think w
8330: 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65  e could optimize
8340: 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20   out the.       
8350: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20   ** ORDER BY in 
8360: 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20  this case since 
8370: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74  the order of ent
8380: 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a  ries in the set.
8390: 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20          ** does 
83a0: 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74  not matter.  But
83b0: 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
83c0: 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20  a LIMIT clause, 
83d0: 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  in which.       
83e0: 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64   ** case the ord
83f0: 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a  er does matter *
8400: 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  /.        pushOn
8410: 74 6f 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20  toSorter(.      
8420: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
8430: 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  ort, p, regResul
8440: 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73  t, regOrig, nRes
8450: 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52  ultCol, nPrefixR
8460: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
8470: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
8480: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8490: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
84a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
84b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
84c0: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d  est->zAffSdst)==
84d0: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20  nResultCol );.  
84e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
84f0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
8500: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
8510: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
8520: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 31   .            r1
8530: 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
8540: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
8550: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8560: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
8570: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
8580: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8590: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
85a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
85b0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
85c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
85d0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
85e0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
85f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8600: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
8610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8630: 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77     /* If any row
8640: 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65   exist in the re
8650: 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64  sult set, record
8660: 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61   that fact and a
8670: 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  bort..    */.   
8680: 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73   case SRT_Exists
8690: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
86a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
86b0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50  P_Integer, 1, iP
86c0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
86d0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
86e0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
86f0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
8700: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
8710: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8720: 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72  this is a scalar
8730: 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20   select that is 
8740: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
8750: 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ssion, then.    
8760: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  ** store the res
8770: 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72  ults in the appr
8780: 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63  opriate memory c
8790: 65 6c 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20  ell or array of 
87a0: 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  .    ** memory c
87b0: 65 6c 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f  ells and break o
87c0: 75 74 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ut of the scan l
87d0: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
87e0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
87f0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8800: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8810: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70  t( nResultCol<=p
8820: 44 65 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20  Dest->nSdst );. 
8830: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
8840: 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20 20  orter(.         
8850: 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74     pParse, pSort
8860: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  , p, regResult, 
8870: 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74  regOrig, nResult
8880: 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29  Col, nPrefixReg)
8890: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
88a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
88b0: 52 65 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74  ResultCol==pDest
88c0: 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20  ->nSdst );.     
88d0: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65     assert( regRe
88e0: 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20  sult==iParm );. 
88f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49         /* The LI
8900: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
8910: 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
8920: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8940: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8950: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
8960: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8970: 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52   */..    case SR
8980: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20  T_Coroutine:    
8990: 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20     /* Send data 
89a0: 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  to a co-routine 
89b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
89c0: 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20  Output: {       
89d0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72   /* Return the r
89e0: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20  esults */.      
89f0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8a00: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8a10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8a20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8a30: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
8a40: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
8a50: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
8a60: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
8a70: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
8a80: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
8a90: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
8aa0: 20 20 20 20 20 20 20 20 20 20 6e 50 72 65 66 69            nPrefi
8ab0: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
8ac0: 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  se if( eDest==SR
8ad0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8af0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
8b00: 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  ield, pDest->iSD
8b10: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
8b20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8b30: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8b40: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
8b50: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8b60: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8b70: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8b80: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8b90: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8ba0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8bc0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
8bd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
8be0: 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  E.    /* Write t
8bf0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  he results into 
8c00: 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65  a priority queue
8c10: 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61   that is order a
8c20: 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20  ccording to.    
8c30: 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72  ** pDest->pOrder
8c40: 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44  By (in pSO).  pD
8c50: 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e  est->iSDParm (in
8c60: 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63   iParm) is the c
8c70: 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20  ursor for an.   
8c80: 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70   ** index with p
8c90: 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75  SO->nExpr+2 colu
8ca0: 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65  mns.  Build a ke
8cb0: 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20  y using pSO for 
8cc0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
8cd0: 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75   pSO->nExpr colu
8ce0: 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  mns, then make s
8cf0: 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65  ure all keys are
8d00: 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e   unique by addin
8d10: 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c  g a.    ** final
8d20: 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c   OP_Sequence col
8d30: 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63  umn.  The last c
8d40: 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63  olumn is the rec
8d50: 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ord as a blob.. 
8d60: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8d70: 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20  RT_DistQueue:.  
8d80: 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65    case SRT_Queue
8d90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  : {.      int nK
8da0: 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  ey;.      int r1
8db0: 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20  , r2, r3;.      
8dc0: 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30  int addrTest = 0
8dd0: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
8de0: 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f   *pSO;.      pSO
8df0: 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72   = pDest->pOrder
8e00: 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  By;.      assert
8e10: 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e  ( pSO );.      n
8e20: 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72  Key = pSO->nExpr
8e30: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
8e40: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
8e50: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32  Parse);.      r2
8e60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8e70: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
8e80: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33  Key+2);.      r3
8e90: 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20   = r2+nKey+1;.  
8ea0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
8eb0: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
8ec0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
8ed0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
8ee0: 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e   DistQueue, then
8ef0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
8f00: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
8f10: 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64    ** on a second
8f20: 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
8f30: 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20   that holds all 
8f40: 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65  values every pre
8f50: 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20  viously.        
8f60: 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
8f70: 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20  queue. */.      
8f80: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
8f90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
8fa0: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
8fb0: 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20  Parm+1, 0, .    
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e      regResult, n
8ff0: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
9000: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
9010: 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (v);.      }.   
9020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9030: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
9040: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
9050: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
9060: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
9070: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
9080: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
9090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
90a0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
90b0: 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20  iParm+1, r3);.  
90c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
90d0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
90e0: 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
90f0: 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T);.      }.    
9100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65    for(i=0; i<nKe
9110: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
9120: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9130: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a  p2(v, OP_SCopy,.
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
9160: 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e  ult + pSO->a[i].
9170: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
9180: 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  - 1,.           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
91a0: 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  2+i);.      }.  
91b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
91d0: 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b  ence, iParm, r2+
91e0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c  nKey);.      sql
91f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9200: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
9210: 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29   r2, nKey+2, r1)
9220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9230: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9240: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9250: 61 72 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65  arm, r1, r2, nKe
9260: 79 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y+2);.      if( 
9270: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
9280: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9290: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
92a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
92b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
92c0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
92d0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
92e0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
92f0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
9300: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
9310: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9320: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
9330: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9340: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
9350: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
9360: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
9370: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
9380: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
9390: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
93a0: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
93b0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
93c0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
93d0: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
93e0: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
93f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
9400: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
9410: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
9420: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
9430: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
9440: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
9450: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
9460: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
9470: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
9480: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
94a0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
94b0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
94c0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
94d0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
94e0: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
94f0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
9500: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
9510: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
9520: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
9530: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
9540: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
9550: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
9560: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
9570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9580: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
9590: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
95a0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
95b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
95c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
95d0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
95e0: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
95f0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
9600: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
9610: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
9620: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
9630: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9640: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
9650: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
9660: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  ){.  int nExtra 
9670: 3d 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  = (N+X)*(sizeof(
9680: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73  CollSeq*)+1) - s
9690: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b  izeof(CollSeq*);
96a0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
96b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
96c0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
96d0: 4b 65 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72  KeyInfo) + nExtr
96e0: 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
96f0: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
9700: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
9710: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
9720: 4b 65 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29  KeyField = (u16)
9730: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69  N;.    p->nAllFi
9740: 65 6c 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29  eld = (u16)(N+X)
9750: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
9760: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
9770: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
9780: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d  Ref = 1;.    mem
9790: 73 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45  set(&p[1], 0, nE
97a0: 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
97b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
97c0: 75 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ult(db);.  }.  r
97d0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
97e0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
97f0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
9800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
9810: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
9820: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
9830: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9840: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
9850: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
9860: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
9870: 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70  qlite3DbFreeNN(p
9880: 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ->db, p);.  }.}.
9890: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
98a0: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
98b0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
98c0: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
98d0: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
98e0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
98f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9900: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
9910: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
9920: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
9930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9940: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
9950: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
9960: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
9970: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
9980: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
9990: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
99a0: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
99b0: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
99c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
99d0: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
99e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
99f0: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
9a00: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
9a10: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
9a20: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9a30: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
9a40: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
9a50: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
9a60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9a70: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
9a80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9a90: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
9aa0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
9ab0: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
9ac0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
9ad0: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
9ae0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
9af0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9b00: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9b10: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
9b20: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
9b30: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
9b40: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
9b50: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9b60: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
9b70: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
9b80: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
9b90: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
9ba0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
9bb0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9bc0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
9bd0: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
9be0: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
9bf0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
9c00: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
9c10: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
9c20: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
9c30: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
9c40: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
9c50: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
9c60: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
9c70: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
9c80: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
9c90: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
9ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
9cb0: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
9cc0: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
9cd0: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
9ce0: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
9cf0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
9d00: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
9d10: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
9d20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
9d30: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9d40: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9d50: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
9d60: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
9d70: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
9d80: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
9d90: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
9da0: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
9db0: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
9dc0: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
9dd0: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
9de0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
9df0: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
9e00: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b  to the end */.){
9e10: 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20  .  int nExpr;.  
9e20: 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a  KeyInfo *pInfo;.
9e30: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9e40: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9e50: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9e60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
9e70: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
9e80: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9e90: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
9ea0: 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
9eb0: 45 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78  Expr-iStart, nEx
9ec0: 74 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49  tra+1);.  if( pI
9ed0: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
9ee0: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
9ef0: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
9f00: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
9f10: 3d 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70  =iStart, pItem=p
9f20: 4c 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20  List->a+iStart; 
9f30: 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  i<nExpr; i++, pI
9f40: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  tem++){.      pI
9f50: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9f60: 61 72 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  art] = sqlite3Ex
9f70: 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72  prNNCollSeq(pPar
9f80: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
9f90: 29 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  );.      pInfo->
9fa0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74  aSortOrder[i-iSt
9fb0: 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  art] = pItem->so
9fc0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
9fd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
9fe0: 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  o;.}../*.** Name
9ff0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
a000: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
a010: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
a020: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
a030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
a040: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
a050: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
a060: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
a070: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
a080: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
a090: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
a0a0: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
a0b0: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
a0c0: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
a0d0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
a0e0: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
a0f0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
a100: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
a110: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
a120: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
a130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
a140: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
a150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
a160: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
a170: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
a180: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
a190: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
a1a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
a1b0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
a1c0: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
a1d0: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
a1e0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
a1f0: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
a200: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
a210: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
a220: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
a230: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
a240: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
a250: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
a260: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
a270: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
a280: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
a290: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
a2a0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
a2b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a2c0: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
a2d0: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
a2e0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
a2f0: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
a300: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
a310: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
a320: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a330: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
a340: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
a350: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
a360: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
a370: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
a380: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
a390: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a3a0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a3b0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a3c0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a3d0: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
a3e0: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
a3f0: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
a400: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
a410: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
a420: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
a430: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
a440: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a450: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
a460: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a470: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
a480: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
a490: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
a4a0: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
a4b0: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
a4c0: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
a4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a4e0: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
a4f0: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
a500: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
a510: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
a520: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
a530: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
a540: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
a550: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
a560: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
a570: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
a580: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
a590: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
a5a0: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
a5b0: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
a5c0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
a5d0: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
a5e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a5f0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a610: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
a620: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
a630: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
a640: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
a650: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
a660: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
a670: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a680: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a690: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a6a0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a6b0: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a6c0: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a6d0: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a6e0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
a6f0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
a700: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
a710: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
a720: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
a730: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a740: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a750: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
a760: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
a770: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
a780: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
a790: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
a7a0: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
a7b0: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
a7c0: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
a7d0: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
a7e0: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
a7f0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
a800: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
a810: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
a820: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
a830: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
a840: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
a850: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
a860: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
a870: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
a880: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
a890: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
a8a0: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
a8b0: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
a8c0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
a8d0: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
a8e0: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
a8f0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
a900: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
a910: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
a920: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a940: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
a950: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
a960: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a990: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
a9a0: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
a9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
a9c0: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
a9d0: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
aa00: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
aa10: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
aa20: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
aa30: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
aa40: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
aa50: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
aa60: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
aa70: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
aa80: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
aa90: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
aaa0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
aab0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
aac0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
aad0: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
aae0: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
aaf0: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
ab00: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
ab10: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
ab20: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
ab30: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
ab40: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
ab50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
ab60: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
ab70: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
ab80: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
ab90: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
aba0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
abb0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
abc0: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
abd0: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
abe0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
abf0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
ac00: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
ac10: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
ac20: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
ac30: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
ac40: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
ac50: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
ac60: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
ac70: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
ac80: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
ac90: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
aca0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
acb0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
acc0: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
acd0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
ace0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
acf0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
ad00: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
ad10: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
ad20: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
ad30: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
ad40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ad50: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ad60: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
ad70: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
ad80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
ad90: 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ent */.  SortCtx
ada0: 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e   *pSort,   /* In
adb0: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65  formation on the
adc0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
add0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
ade0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
adf0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
ae00: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
ae10: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
ae20: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
ae30: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
ae40: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
ae50: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
ae80: 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  d statement */. 
ae90: 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d   int addrBreak =
aea0: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e   pSort->labelDon
aeb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
aec0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78   Jump here to ex
aed0: 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  it loop */.  int
aee0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20   addrContinue = 
aef0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
af00: 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d  abel(v);  /* Jum
af10: 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20  p here for next 
af20: 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  cycle */.  int a
af30: 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f  ddr;.  int addrO
af40: 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  nce = 0;.  int i
af50: 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Tab;.  ExprList 
af60: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72  *pOrderBy = pSor
af70: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  t->pOrderBy;.  i
af80: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
af90: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
afa0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
afb0: 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67  DParm;.  int reg
afc0: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
afd0: 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  wid;.  int iCol;
afe0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
aff0: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b010: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
b020: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
b030: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
b040: 53 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seq;            
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b060: 75 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63  ue if sorter rec
b070: 6f 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71  ord includes seq
b080: 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 73 74 72 75 63  . no. */.  struc
b090: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b0a0: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
b0b0: 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72  ist->a;..  asser
b0c0: 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29  t( addrBreak<0 )
b0d0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ;.  if( pSort->l
b0e0: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
b0f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b100: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
b110: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
b120: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
b130: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
b140: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
b150: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
b160: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b170: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
b180: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
b190: 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e    iTab = pSort->
b1a0: 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  iECursor;.  if( 
b1b0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b1c0: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
b1d0: 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65  Coroutine || eDe
b1e0: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20  st==SRT_Mem ){. 
b1f0: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b     regRowid = 0;
b200: 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44  .    regRow = pD
b210: 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65  est->iSdst;.  }e
b220: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
b230: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
b240: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b250: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
b260: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
b270: 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29  pParse, nColumn)
b280: 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70  ;.  }.  nKey = p
b290: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d  OrderBy->nExpr -
b2a0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
b2b0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
b2c0: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
b2d0: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
b2e0: 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75     int regSortOu
b2f0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
b300: 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  em;.    iSortTab
b310: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
b320: 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  +;.    if( pSort
b330: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a  ->labelBkOut ){.
b340: 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d        addrOnce =
b350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b360: 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
b370: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b380: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b390: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b3a0: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
b3b0: 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74  SortTab, regSort
b3c0: 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c  Out, nKey+1+nCol
b3d0: 75 6d 6e 29 3b 0a 20 20 20 20 69 66 28 20 61 64  umn);.    if( ad
b3e0: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
b3f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b400: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
b410: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
b420: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b430: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
b440: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
b450: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b460: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
b470: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
b480: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
b490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b4a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
b4b0: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
b4c0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
b4d0: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
b4e0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
b4f0: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
b500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b510: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
b520: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
b530: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b540: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b550: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b560: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
b570: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
b580: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
b590: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
b5a0: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
b5b0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
b5c0: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
b5d0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b5e0: 6c 3d 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20  l==0 ) iCol++;. 
b5f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c 75   }.  for(i=nColu
b600: 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  mn-1; i>=0; i--)
b610: 7b 0a 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b  {.    int iRead;
b620: 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b  .    if( aOutEx[
b630: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
b640: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 52 65 61  ol ){.      iRea
b650: 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  d = aOutEx[i].u.
b660: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b  x.iOrderByCol-1;
b670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b680: 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d 2d    iRead = iCol--
b690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b6a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b6b0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
b6c0: 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67  tTab, iRead, reg
b6d0: 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65  Row+i);.    Vdbe
b6e0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
b6f0: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
b700: 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  e ? aOutEx[i].zN
b710: 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e  ame : aOutEx[i].
b720: 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73  zSpan));.  }.  s
b730: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
b740: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
b750: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
b760: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
b770: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b780: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
b790: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
b7a0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b7b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b7c0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
b7d0: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
b7e0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b7f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b800: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
b810: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
b820: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b840: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
b850: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
b860: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73  sert( nColumn==s
b870: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b880: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20  Dest->zAffSdst) 
b890: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b8a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
b8b0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b8c0: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  Row, nColumn, re
b8d0: 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
b900: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b910: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b920: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b930: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
b940: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b960: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
b970: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
b980: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
b990: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
b9a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b9b0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
b9c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
b9d0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
b9e0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
b9f0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
ba00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
ba10: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
ba20: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
ba30: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
ba40: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
ba50: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
ba60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ba70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ba80: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
ba90: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
baa0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
bab0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
bac0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
bad0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bae0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
baf0: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
bb00: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
bb10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
bb20: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
bb30: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
bb40: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
bb50: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
bb60: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
bb70: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
bb80: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
bb90: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
bba0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
bbb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bbc0: 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20   regRowid ){.   
bbd0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
bbe0: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
bbf0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bc00: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
bc10: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
bc20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bc30: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
bc40: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
bc50: 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gRow);.    }.   
bc60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
bc70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
bc80: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
bc90: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
bca0: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
bcb0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
bcc0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
bcd0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
bce0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
bcf0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
bd00: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
bd10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bd20: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
bd30: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bd40: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bd50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
bd60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bd70: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
bd80: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
bd90: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
bda0: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
bdb0: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
bdc0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
bdd0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
bde0: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
bdf0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
be00: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
be10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
be20: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
be30: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
be40: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
be50: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
be60: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
be70: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
be80: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
be90: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
bea0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
beb0: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
bec0: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
bed0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
bee0: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
bef0: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
bf00: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
bf10: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bf20: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
bf30: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
bf40: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
bf50: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
bf60: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
bf70: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
bf80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bf90: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
bfa0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
bfb0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
bfc0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
bfd0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
bfe0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
bff0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
c000: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
c010: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
c020: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
c030: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
c040: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
c050: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
c060: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
c070: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
c080: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
c090: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
c0a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
c0b0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
c0c0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
c0d0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
c0e0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
c0f0: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
c100: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
c110: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
c120: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
c130: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
c140: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
c150: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
c160: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
c170: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
c180: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
c190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
c1a0: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
c1b0: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
c1c0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
c1d0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
c1e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c1f0: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
c200: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
c210: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
c220: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c230: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c240: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c250: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20  Type(A,B,C,D,E) 
c260: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
c270: 2c 42 2c 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20  ,B,C,D,E).#else 
c280: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
c290: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c2a0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
c2b0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c2c0: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20  Type(A,B,C,D,E) 
c2d0: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
c2e0: 2c 42 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ,B).#endif.stati
c2f0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
c300: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20  lumnTypeImpl(.  
c310: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
c320: 2c 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  , .#ifndef SQLIT
c330: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c340: 4d 45 54 41 44 41 54 41 0a 20 20 45 78 70 72 20  METADATA.  Expr 
c350: 2a 70 45 78 70 72 0a 23 65 6c 73 65 0a 20 20 45  *pExpr.#else.  E
c360: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
c370: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
c380: 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  gDb,.  const cha
c390: 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20  r **pzOrigTab,. 
c3a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c3b0: 4f 72 69 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29  OrigCol.#endif.)
c3c0: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
c3d0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
c3e0: 20 6a 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   j;.#ifdef SQLIT
c3f0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c400: 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20  METADATA.  char 
c410: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
c420: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c430: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
c440: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c450: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64  rigCol = 0;.#end
c460: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  if..  assert( pE
c470: 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  xpr!=0 );.  asse
c480: 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
c490: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
c4a0: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
c4b0: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f  AGG_COLUMN );  /
c4c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
c4d0: 75 6e 65 73 20 62 65 66 6f 72 65 20 61 67 67 72  unes before aggr
c4e0: 65 67 61 74 65 73 0a 20 20 20 20 20 20 20 20 20  egates.         
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
c510: 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2a   are processed *
c520: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  /.  switch( pExp
c530: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
c540: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
c550: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c560: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
c570: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
c580: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
c590: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
c5a0: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
c5b0: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
c5c0: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
c5d0: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
c5e0: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
c5f0: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
c600: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
c610: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
c620: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
c630: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
c640: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
c650: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
c660: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
c670: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
c680: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
c690: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
c6a0: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
c6b0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
c6c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
c6d0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
c6e0: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
c6f0: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
c700: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
c710: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
c720: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
c730: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
c740: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
c750: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
c760: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
c770: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
c780: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
c790: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
c7a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
c7b0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
c7c0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
c7d0: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
c7e0: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
c7f0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
c800: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
c810: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
c820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c830: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
c840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c850: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
c860: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
c870: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
c880: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
c890: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
c8a0: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
c8b0: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
c8c0: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
c8d0: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
c8e0: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
c8f0: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
c900: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
c910: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
c920: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
c930: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
c940: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
c950: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
c960: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
c970: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
c980: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
c990: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
c9a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c9b0: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
c9c0: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
c9d0: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
c9e0: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
c9f0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
ca00: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
ca10: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
ca20: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
ca30: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
ca40: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
ca50: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
ca60: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
ca70: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
ca80: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
ca90: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
caa0: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
cab0: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
cac0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
cad0: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
cae0: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
caf0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
cb00: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
cb10: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
cb20: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
cb30: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
cb40: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
cb50: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
cb60: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
cb70: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
cb80: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
cb90: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
cba0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
cbb0: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
cbc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cbd0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
cbe0: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
cbf0: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
cc00: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
cc10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cc20: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
cc30: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
cc40: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
cc50: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
cc60: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
cc70: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cc80: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
cc90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
cca0: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
ccb0: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
ccc0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
ccd0: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
cce0: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
ccf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cd00: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
cd10: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cd20: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cd30: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cd40: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cd50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cd60: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cd70: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cd80: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cd90: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cda0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cdb0: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cdc0: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cdd0: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cde0: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cdf0: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
ce00: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
ce10: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
ce20: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
ce30: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
ce40: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
ce50: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
ce60: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
ce70: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
ce80: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
ce90: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
cea0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
ceb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
cec0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
ced0: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
cee0: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
cef0: 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  Col); .        }
cf00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cf10: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
cf20: 74 61 62 6c 65 20 6f 72 20 61 20 43 54 45 20 74  table or a CTE t
cf30: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
cf40: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 23  assert( !pS );.#
cf50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cf60: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
cf70: 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20  ATA.        if( 
cf80: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
cf90: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
cfa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
cfb0: 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28  l==XN_ROWID || (
cfc0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
cfd0: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
cfe0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cff0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
d000: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
d010: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
d020: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
d030: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d040: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
d050: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
d060: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
d070: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
d080: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
d090: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
d0a0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ],0);.        }.
d0b0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
d0c0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
d0d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
d0e0: 3e 70 50 61 72 73 65 20 26 26 20 70 54 61 62 2d  >pParse && pTab-
d0f0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
d100: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
d110: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
d120: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
d130: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
d140: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
d150: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
d160: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d170: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
d180: 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
d190: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
d1a0: 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20  ol==XN_ROWID || 
d1b0: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
d1c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
d1d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
d1e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
d1f0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
d200: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
d210: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
d220: 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  e = sqlite3Colum
d230: 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f  nType(&pTab->aCo
d240: 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20  l[iCol],0);.    
d250: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
d260: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d270: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
d280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d290: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
d2a0: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
d2b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
d2c0: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
d2d0: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
d2e0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
d2f0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
d300: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
d310: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
d320: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d330: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
d340: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
d350: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
d360: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
d370: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
d380: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
d390: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
d3a0: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
d3b0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
d3c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
d3d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
d3e0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
d3f0: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
d400: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
d410: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
d420: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
d430: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
d440: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
d450: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
d460: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
d470: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
d480: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a  b, &zOrigCol); .
d490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d4a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
d4b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d4c0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
d4d0: 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72  ATA  .  if( pzOr
d4e0: 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  igDb ){.    asse
d4f0: 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26  rt( pzOrigTab &&
d500: 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20   pzOrigCol );.  
d510: 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f    *pzOrigDb = zO
d520: 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  rigDb;.    *pzOr
d530: 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62  igTab = zOrigTab
d540: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c  ;.    *pzOrigCol
d550: 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d   = zOrigCol;.  }
d560: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
d570: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
d580: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d590: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
d5a0: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
d5b0: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
d5c0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
d5d0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
d5e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
d5f0: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
d600: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d610: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
d620: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
d630: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
d640: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
d650: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
d660: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
d670: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
d680: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
d690: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
d6a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
d6b0: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
d6c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d6d0: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
d6e0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
d6f0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
d700: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
d710: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
d720: 0a 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30  .  sNC.pNext = 0
d730: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d740: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
d750: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
d760: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
d770: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
d780: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
d790: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d7a0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
d7b0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
d7c0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
d7d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d7e0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
d7f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d800: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
d810: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
d820: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
d830: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
d840: 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20  &zOrigCol);..   
d850: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
d860: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
d870: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
d880: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
d890: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
d8a0: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
d8b0: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
d8c0: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
d8d0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
d8e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d8f0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
d900: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
d910: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
d920: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
d930: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
d940: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d950: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d960: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d970: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
d980: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
d990: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
d9a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d9b0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d9c0: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
d9d0: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
d9e0: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
d9f0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
da00: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
da10: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
da20: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
da30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
da40: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
da50: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
da60: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
da70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
da80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
da90: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
daa0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
dab0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
dac0: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
dad0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
dae0: 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  he only guarante
daf0: 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61  e that SQLite ma
db00: 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  kes about column
db10: 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69   names is that i
db20: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
db30: 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65  has an AS clause
db40: 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
db50: 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20  name, that will 
db60: 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64  be the name used
db70: 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65  ..** That is the
db80: 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64   only documented
db90: 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77   guarantee.  How
dba0: 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20  ever, countless 
dbb0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20  applications.** 
dbc0: 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74  developed over t
dbd0: 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61  he years have ma
dbe0: 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75  de baseless assu
dbf0: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f  mptions about co
dc00: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e  lumn names.** an
dc10: 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20  d will break if 
dc20: 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e  those assumption
dc30: 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63  s changes.  Henc
dc40: 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63  e, use extreme c
dc50: 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d  aution.** when m
dc60: 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f  odifying this ro
dc70: 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62  utine to avoid b
dc80: 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a  reaking legacy..
dc90: 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20  **.** See Also: 
dca0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
dcb0: 6f 6d 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a  omExprList().**.
dcc0: 2a 2a 20 54 68 65 20 50 52 41 47 4d 41 20 73 68  ** The PRAGMA sh
dcd0: 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
dce0: 20 61 6e 64 20 50 52 41 47 4d 41 20 66 75 6c 6c   and PRAGMA full
dcf0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65  _column_names se
dd00: 74 74 69 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65  ttings are.** de
dd10: 70 72 65 63 61 74 65 64 2e 20 20 54 68 65 20 64  precated.  The d
dd20: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 69  efault setting i
dd30: 73 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c  s short=ON, full
dd40: 3d 4f 46 46 2e 20 20 39 39 2e 39 25 20 6f 66 20  =OFF.  99.9% of 
dd50: 61 6c 6c 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  all.** applicati
dd60: 6f 6e 73 20 73 68 6f 75 6c 64 20 6f 70 65 72 61  ons should opera
dd70: 74 65 20 74 68 69 73 20 77 61 79 2e 20 20 4e 65  te this way.  Ne
dd80: 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 6e  vertheless, we n
dd90: 65 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 74  eed to support t
dda0: 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65  he.** other mode
ddb0: 73 20 66 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a  s for legacy:.**
ddc0: 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 46 46  .**    short=OFF
ddd0: 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20  , full=OFF:     
dde0: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   Column name is 
ddf0: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
de00: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 69  expression has i
de10: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 61 70 70    originally app
de40: 65 61 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ears in the SELE
de50: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  CT statement.  I
de60: 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74    other words, t
de90: 68 65 20 7a 53 70 61 6e 20 6f 66 20 74 68 65 20  he zSpan of the 
dea0: 72 65 73 75 6c 74 20 65 78 70 72 65 73 73 69 6f  result expressio
deb0: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  n..**.**    shor
dec0: 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20  t=ON, full=OFF: 
ded0: 20 20 20 20 20 20 28 54 68 69 73 20 69 73 20 74        (This is t
dee0: 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69  he default setti
def0: 6e 67 29 2e 20 20 49 66 20 74 68 65 20 72 65 73  ng).  If the res
df00: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 72 65 66 65 72 73 20 64 69 72 65 63      refers direc
df30: 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65 20 63  tly to a table c
df40: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a  olumn, then the.
df50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61  result column na
df80: 6d 65 20 69 73 20 6a 75 73 74 20 74 68 65 20 74  me is just the t
df90: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20  able column.**  
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
dfc0: 3a 20 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72  : COLUMN.  Other
dfd0: 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a  wise use zSpan..
dfe0: 2a 2a 0a 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e  **.**    full=ON
dff0: 2c 20 73 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20  , short=ANY:    
e000: 20 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74     If the result
e010: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
e020: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
e030: 6d 6e 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn,.**          
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 74 68 65 6e 20 74 68 65 20 72 65 73      then the res
e060: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
e070: 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e  with the table n
e080: 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ame.**          
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 70 72 65 66 69 78 2c 20 65 78 3a 20      prefix, ex: 
e0b0: 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f  TABLE.COLUMN.  O
e0c0: 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53 70  therwise use zSp
e0d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  an..*/.static vo
e0e0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
e0f0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
e100: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
e110: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
e120: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e130: 6c 65 63 74 20 20 20 20 20 2f 2a 20 47 65 6e 65  lect     /* Gene
e140: 72 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rate column name
e150: 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  s for this SELEC
e160: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29  T statement */.)
e170: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
e180: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
e190: 6e 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70  nt i;.  Table *p
e1a0: 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  Tab;.  SrcList *
e1b0: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
e1c0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
e1d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e1e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
e1f0: 66 75 6c 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  fullName;    /* 
e200: 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20  TABLE.COLUMN if 
e210: 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64  no AS clause and
e220: 20 69 73 20 61 20 64 69 72 65 63 74 20 74 61 62   is a direct tab
e230: 6c 65 20 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20  le ref */.  int 
e240: 73 72 63 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20  srcName;     /* 
e250: 43 4f 4c 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e  COLUMN or TABLE.
e260: 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20  COLUMN if no AS 
e270: 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 64 69  clause and is di
e280: 72 65 63 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  rect */..#ifndef
e290: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
e2a0: 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69  LAIN.  /* If thi
e2b0: 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c  s is an EXPLAIN,
e2c0: 20 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20   skip this step 
e2d0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
e2e0: 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
e2f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
e300: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  if..  if( pParse
e310: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
e320: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e330: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  d ) return;.  /*
e340: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   Column names ar
e350: 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  e determined by 
e360: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
e370: 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rm of a compound
e380: 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69   select */.  whi
e390: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
e3a0: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
e3b0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
e3c0: 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
e3d0: 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63 74 2c  ,pParse,pSelect,
e3e0: 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6c  ("generating col
e3f0: 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29 3b 0a  umn names\n"));.
e400: 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65    pTabList = pSe
e410: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45  lect->pSrc;.  pE
e420: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
e430: 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
e440: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
e450: 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20  rt( pTabList!=0 
e460: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  );.  pParse->col
e470: 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20  NamesSet = 1;.  
e480: 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e  fullName = (db->
e490: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
e4a0: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
e4b0: 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62  .  srcName = (db
e4c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e4d0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
e4e0: 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a  =0 || fullName;.
e4f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e500: 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73  NumCols(v, pELis
e510: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72  t->nExpr);.  for
e520: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
e530: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
e540: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
e550: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
e560: 20 20 20 20 61 73 73 65 72 74 28 20 70 21 3d 30      assert( p!=0
e570: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e580: 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  p->op!=TK_AGG_CO
e590: 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20  LUMN );  /* Agg 
e5a0: 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73 20 6e  processing has n
e5b0: 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20  ot run yet */.  
e5c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21    assert( p->op!
e5d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
e5e0: 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43  >pTab!=0 ); /* C
e5f0: 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f 74 20  overing idx not 
e600: 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20 20  yet coded */.   
e610: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
e620: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
e630: 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73 65   /* An AS clause
e640: 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66 69   always takes fi
e650: 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f 0a  rst priority */.
e660: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
e670: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
e680: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
e690: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e6a0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e6b0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e6c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
e6d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e6e0: 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f 70  srcName && p->op
e6f0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
e700: 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b       char *zCol;
e710: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
e720: 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  = p->iColumn;.  
e730: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 54      pTab = p->pT
e740: 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ab;.      assert
e750: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
e760: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e770: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e780: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
e790: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
e7a0: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e7b0: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e7c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e7d0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
e7e0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
e7f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
e800: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
e810: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
e820: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e830: 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  fullName ){.    
e840: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
e850: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
e860: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
e870: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
e880: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
e890: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e8a0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e8b0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e8c0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
e8d0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
e8e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e900: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e910: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
e920: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
e930: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
e940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
e960: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e970: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
e980: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
e990: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
e9a0: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
e9b0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
e9c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e9d0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e9e0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e9f0: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
ea00: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
ea10: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
ea20: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
ea30: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
ea40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
ea50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
ea60: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
ea70: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
ea80: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
ea90: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
eaa0: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
eab0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
eac0: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
ead0: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
eae0: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
eaf0: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
eb00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
eb10: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
eb20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
eb30: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
eb40: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
eb50: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
eb60: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
eb70: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
eb80: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
eb90: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
eba0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
ebb0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
ebc0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
ebd0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
ebe0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
ebf0: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
ec00: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
ec10: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
ec20: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
ec30: 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  NOMEM..**.** The
ec40: 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20   only guarantee 
ec50: 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65  that SQLite make
ec60: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ec70: 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20  ames is that if 
ec80: 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61  the.** column ha
ec90: 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61  s an AS clause a
eca0: 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61  ssigning it a na
ecb0: 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  me, that will be
ecc0: 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a   the name used..
ecd0: 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f  ** That is the o
ece0: 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67  nly documented g
ecf0: 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76  uarantee.  Howev
ed00: 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70  er, countless ap
ed10: 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65  plications.** de
ed20: 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65  veloped over the
ed30: 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65   years have made
ed40: 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70   baseless assump
ed50: 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75  tions about colu
ed60: 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20  mn names.** and 
ed70: 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68  will break if th
ed80: 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ose assumptions 
ed90: 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c  changes.  Hence,
eda0: 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75   use extreme cau
edb0: 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64  tion.** when mod
edc0: 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74  ifying this rout
edd0: 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65  ine to avoid bre
ede0: 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a  aking legacy..**
edf0: 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67 65  .** See Also: ge
ee00: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ee10: 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s().*/.int sqlit
ee20: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
ee30: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
ee40: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
ee50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
ee60: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
ee70: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
ee80: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
ee90: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
eea0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
eeb0: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eed0: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
eee0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
eef0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
ef00: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
ef10: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
ef20: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
ef30: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
ef40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ef50: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
ef60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
ef70: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ef90: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
efa0: 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20 20    u32 cnt;      
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
efc0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
efd0: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
efe0: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
eff0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
f000: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
f010: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
f020: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
f030: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
f040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
f050: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
f060: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
f070: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
f080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
f090: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
f0a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
f0d0: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
f0e0: 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20 20    Hash ht;      
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f100: 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20 63   Hash table of c
f110: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a  olumn names */..
f120: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
f130: 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70 45  t(&ht);.  if( pE
f140: 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c  List ){.    nCol
f150: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
f160: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c  ;.    aCol = sql
f170: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
f180: 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c  (db, sizeof(aCol
f190: 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  [0])*nCol);.    
f1a0: 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d  testcase( aCol==
f1b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f  0 );.    if( nCo
f1c0: 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c 20 3d  l>32767 ) nCol =
f1d0: 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73 65 7b   32767;.  }else{
f1e0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
f1f0: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
f200: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d  .  assert( nCol=
f210: 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20  =(i16)nCol );.  
f220: 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  *pnCol = nCol;. 
f230: 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a   *paCol = aCol;.
f240: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
f250: 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26  =aCol; i<nCol &&
f260: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
f270: 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ed; i++, pCol++)
f280: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20  {.    /* Get an 
f290: 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65  appropriate name
f2a0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   for the column.
f2b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
f2c0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
f2d0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
f2e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
f2f0: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
f300: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
f310: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
f320: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
f330: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
f340: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78      Expr *pColEx
f350: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
f360: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
f370: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
f380: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
f390: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
f3a0: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
f3b0: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
f3c0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
f3d0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
f3e0: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
f3f0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
f400: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  pColExpr->op!=TK
f410: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
f420: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70       if( pColExp
f430: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
f440: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
f450: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
f460: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
f470: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
f480: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
f490: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
f4a0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
f4b0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
f4c0: 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  b;.        asser
f4d0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
f4e0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
f4f0: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
f500: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
f510: 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  Name = iCol>=0 ?
f520: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
f530: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
f540: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
f550: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
f560: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
f570: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
f580: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
f590: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
f5a0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
f5b0: 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75  me = pColExpr->u
f5c0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
f5d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
f5e0: 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61   Use the origina
f5f0: 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f  l text of the co
f600: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
f610: 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20  as its name */. 
f620: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
f630: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
f640: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
f650: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  .    if( zName )
f660: 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  {.      zName = 
f670: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
f680: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
f690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61  }else{.      zNa
f6a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
f6b0: 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64  ntf(db,"column%d
f6c0: 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ",i+1);.    }.. 
f6d0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
f6e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
f6f0: 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74  is unique.  If t
f700: 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75  he name is not u
f710: 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70  nique,.    ** ap
f720: 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20  pend an integer 
f730: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
f740: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
f750: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
f760: 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77    cnt = 0;.    w
f770: 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73  hile( zName && s
f780: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
f790: 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ht, zName)!=0 ){
f7a0: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  .      nName = s
f7b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f7c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
f7d0: 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20   nName>0 ){.    
f7e0: 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d      for(j=nName-
f7f0: 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65  1; j>0 && sqlite
f800: 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a  3Isdigit(zName[j
f810: 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20  ]); j--){}.     
f820: 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d     if( zName[j]=
f830: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a  =':' ) nName = j
f840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f850: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
f860: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a  Printf(db, "%.*z
f870: 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61  :%u", nName, zNa
f880: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
f890: 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71    if( cnt>3 ) sq
f8a0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
f8b0: 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63  (sizeof(cnt), &c
f8c0: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
f8d0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
f8e0: 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  me;.    sqlite3C
f8f0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
f900: 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29  romName(0, pCol)
f910: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
f920: 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  && sqlite3HashIn
f930: 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c  sert(&ht, zName,
f940: 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a   pCol)==pCol ){.
f950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
f960: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d  Fault(db);.    }
f970: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
f980: 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20  shClear(&ht);.  
f990: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
f9a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
f9b0: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
f9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f9d0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
f9e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
f9f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fa00: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
fa10: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
fa20: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
fa30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fa40: 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
fa50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fa60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
fa70: 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
fa80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
fa90: 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
faa0: 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
fab0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
fac0: 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
fad0: 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
fae0: 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
faf0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
fb00: 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
fb10: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
fb20: 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
fb30: 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
fb40: 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
fb50: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
fb60: 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
fb70: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
fb80: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
fb90: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
fba0: 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
fbb0: 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
fbc0: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
fbd0: 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
fbe0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fbf0: 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
fc00: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
fc10: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fc20: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
fc30: 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
fc40: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
fc50: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
fc60: 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
fc70: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
fc80: 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
fc90: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
fca0: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
fcb0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
fcc0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
fcd0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
fce0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
fcf0: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
fd00: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
fd10: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
fd20: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
fd30: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
fd40: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
fd50: 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
fd60: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
fd70: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
fd80: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
fd90: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
fda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
fdb0: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
fdc0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
fdd0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
fde0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
fdf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
fe00: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
fe10: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
fe20: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
fe30: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
fe40: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
fe50: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
fe60: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
fe70: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
fe80: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
fe90: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
fea0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
feb0: 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
fec0: 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
fed0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
fee0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
fef0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
ff00: 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  /* pCol->szEst =
ff10: 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73   ... // Column s
ff20: 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45  ize est for SELE
ff30: 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20  CT tables never 
ff40: 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c  used */.    pCol
ff50: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
ff60: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
ff70: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  (p);.    if( zTy
ff80: 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20 3d 20  pe ){.      m = 
ff90: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ffa0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20  zType);.      n 
ffb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ffc0: 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  0(pCol->zName);.
ffd0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
ffe0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  e = sqlite3DbRea
fff0: 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70  llocOrFree(db, p
10000 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b  Col->zName, n+m+
10010 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  2);.      if( pC
10020 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  ol->zName ){.   
10030 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f       memcpy(&pCo
10040 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a  l->zName[n+1], z
10050 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20  Type, m+1);.    
10060 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
10070 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
10080 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20  STYPE;.      }. 
10090 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f     }.    if( pCo
100a0 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
100b0 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
100c0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
100d0 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  B;.    pColl = s
100e0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
100f0 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
10100 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
10110 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b  Col->zColl==0 ){
10120 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
10130 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
10140 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
10150 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
10160 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
10170 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e  ow = 1; /* Any n
10180 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f  on-zero value wo
10190 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rks */.}../*.** 
101a0 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
101b0 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
101c0 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
101d0 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
101e0 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
101f0 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
10200 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
10210 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
10220 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
10230 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10240 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
10250 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
10260 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10270 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
10280 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
10290 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
102a0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
102b0 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
102c0 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
102d0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
102e0 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
102f0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
10300 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
10310 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
10320 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
10330 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
10340 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
10350 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
10360 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
10370 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
10380 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
10390 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
103a0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
103b0 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
103c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
103d0 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
103e0 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
103f0 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
10400 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
10410 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
10420 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
10430 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
10440 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
10450 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70  .bDisable );.  p
10460 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
10470 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
10480 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
10490 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
104a0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
104b0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
104c0 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  6) );.  sqlite3C
104d0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
104e0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
104f0 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
10500 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
10510 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
10520 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
10530 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
10540 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
10550 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
10560 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
10570 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
10580 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
10590 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
105a0 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
105b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
105c0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
105d0 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
105e0 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
105f0 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
10600 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
10610 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
10620 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10630 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
10640 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
10650 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
10660 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
10670 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
10680 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
10690 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  e->pVdbe ){.    
106a0 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70  return pParse->p
106b0 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Vdbe;.  }.  if( 
106c0 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
106d0 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d  l==0.   && Optim
106e0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
106f0 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
10700 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
10710 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  .  ){.    pParse
10720 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
10730 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
10740 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  n sqlite3VdbeCre
10750 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a  ate(pParse);.}..
10760 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
10770 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  he iLimit and iO
10780 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20  ffset fields of 
10790 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64  the SELECT based
107a0 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69   on the.** pLimi
107b0 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
107c0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e  pLimit->pLeft an
107d0 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74  d pLimit->pRight
107e0 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
107f0 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
10800 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
10810 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
10820 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
10830 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
10840 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
10850 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
10860 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
10870 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
10880 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
10890 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
108a0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
108b0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
108c0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
108d0 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
108e0 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
108f0 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
10900 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
10910 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
10920 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
10930 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
10940 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
10950 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
10960 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10970 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
10980 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
10990 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
109a0 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61 6e 64  Limit->pLeft and
109b0 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2e   pLimit->pRight.
109c0 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e 64 20    iLimit.** and 
109d0 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68  iOffset should h
109e0 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20  ave been preset 
109f0 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  to appropriate d
10a00 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a  efault values (z
10a10 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  ero).** prior to
10a20 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
10a30 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
10a40 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65   iOffset registe
10a50 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  r (if it exists)
10a60 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
10a70 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  to the value.** 
10a80 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20  of the OFFSET.  
10a90 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73  The iLimit regis
10aa0 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
10ab0 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65  ed to LIMIT.  Re
10ac0 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65  gister.** iOffse
10ad0 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  t+1 is initializ
10ae0 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53  ed to LIMIT+OFFS
10af0 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69  ET..**.** Only i
10b00 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  f pLimit->pLeft!
10b10 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
10b20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
10b30 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
10b40 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
10b50 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
10b60 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
10b70 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
10b80 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
10b90 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
10ba0 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
10bb0 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
10bc0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
10bd0 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
10be0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
10bf0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
10c00 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
10c10 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
10c20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
10c30 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
10c40 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  fset;.  int n;. 
10c50 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
10c60 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20 69 66  p->pLimit;..  if
10c70 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
10c80 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
10c90 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
10ca0 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
10cb0 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
10cc0 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65  me.  ** controve
10cd0 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
10ce0 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
10cf0 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
10d00 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
10d10 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
10d20 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
10d30 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
10d40 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
10d50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10d60 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
10d70 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29 7b 0a    if( pLimit ){.
10d80 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 6d      assert( pLim
10d90 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d 49 54  it->op==TK_LIMIT
10da0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10db0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21 3d 30  pLimit->pLeft!=0
10dc0 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   );.    p->iLimi
10dd0 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
10de0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10df0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10e00 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10e10 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10e20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10e30 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 4c  ExprIsInteger(pL
10e40 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 29  imit->pLeft, &n)
10e50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10e60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10e70 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c  P_Integer, n, iL
10e80 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62  imit);.      Vdb
10e90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
10ea0 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
10eb0 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
10ec0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ed0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72  3VdbeGoto(v, iBr
10ee0 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
10ef0 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
10f00 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69  >nSelectRow>sqli
10f10 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10f20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
10f30 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
10f40 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
10f50 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  n);.        p->s
10f60 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69  elFlags |= SF_Fi
10f70 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  xedLimit;.      
10f80 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10f90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10fa0 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
10fb0 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d 69 74  t->pLeft, iLimit
10fc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10fe0 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d  _MustBeInt, iLim
10ff0 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
11000 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
11010 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
11020 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
11030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
11050 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ot, iLimit, iBre
11060 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11070 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
11080 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  if( pLimit->pRig
11090 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ht ){.      p->i
110a0 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
110b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
110c0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
110d0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
110e0 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
110f0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
11100 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
11110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
11120 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69 6d 69  de(pParse, pLimi
11130 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66 66 73  t->pRight, iOffs
11140 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
11150 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11160 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
11170 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
11180 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
11190 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
111a0 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
111b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
111c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
111d0 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
111e0 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
111f0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
11200 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11210 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
11220 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11230 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11240 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
11250 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
11260 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
11270 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11280 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
11290 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
112a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
112b0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
112c0 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
112d0 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
112e0 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
112f0 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
11300 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
11310 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
11320 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
11330 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
11340 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
11350 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
11360 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
11370 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
11380 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
11390 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
113a0 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
113b0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
113c0 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
113d0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
113e0 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
113f0 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
11400 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
11410 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
11420 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11430 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
11440 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
11450 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
11460 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
11470 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
11480 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
11490 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
114a0 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
114b0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
114c0 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
114d0 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
114e0 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
114f0 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
11500 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
11510 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
11520 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
11530 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
11540 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
11550 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
11560 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11570 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
11580 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
11590 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
115a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
115b0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
115c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
115d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
115e0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
115f0 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
11600 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
11610 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
11620 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
11630 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
11640 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
11650 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
11660 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
11670 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
11680 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
11690 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
116a0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
116b0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
116c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
116d0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
116e0 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
116f0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
11700 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
11710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
11720 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
11730 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
11740 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11750 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
11760 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
11770 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
11780 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
11790 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
117a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
117b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
117c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
117d0 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
117e0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
117f0 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
11800 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
11810 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
11820 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
11830 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
11840 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
11850 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
11860 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
11870 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
11880 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
11890 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
118a0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
118b0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
118c0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
118d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
118e0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
118f0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
11900 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
11910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11920 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
11930 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
11940 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
11950 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
11960 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
11970 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
11980 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
11990 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
119a0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
119b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
119c0 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
119d0 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
119e0 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
119f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
11a10 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
11a20 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
11a30 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
11a40 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
11a50 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
11a60 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
11a70 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
11a80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11a90 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
11aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
11ab0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
11ac0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
11ad0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
11ae0 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
11af0 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
11b00 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
11b10 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
11b20 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
11b30 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
11b40 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
11b50 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
11b60 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
11b90 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
11ba0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
11bd0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
11be0 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
11bf0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
11c00 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
11c10 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
11c20 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
11c30 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
11c40 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
11c50 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
11c60 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
11c70 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
11c80 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
11c90 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
11ca0 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
11cb0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
11cc0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
11cd0 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
11ce0 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
11cf0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
11d00 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11d10 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
11d20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
11d30 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
11d40 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
11d50 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
11d60 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
11d70 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
11d80 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
11d90 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
11da0 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
11db0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
11dc0 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
11dd0 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
11de0 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
11df0 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
11e00 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
11e10 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
11e20 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
11e30 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
11e40 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
11e50 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
11e60 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
11e70 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
11e80 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
11e90 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
11ea0 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
11eb0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
11ec0 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
11ed0 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
11ee0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
11ef0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
11f00 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
11f10 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
11f20 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
11f30 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
11f40 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
11f50 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
11f60 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
11f70 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
11f80 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
11f90 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
11fa0 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
11fb0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
11fc0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
11fd0 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
11fe0 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
11ff0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
12000 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
12010 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
12020 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
12030 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
12040 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
12050 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
12060 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
12070 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
12080 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
12090 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
120a0 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
120b0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
120c0 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
120d0 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
120e0 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
120f0 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
12100 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
12110 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
12120 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
12130 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
12140 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
12150 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
12160 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
12170 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
12180 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
12190 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
121a0 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
121b0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
121c0 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
121d0 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
121e0 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
121f0 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
12200 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
12210 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
12220 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
12230 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
12240 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
12250 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
12260 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12270 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12280 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12290 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
122a0 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
122b0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
122c0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
122d0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
122e0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
122f0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
12300 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
12310 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
12320 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
12330 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
12340 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
12350 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
12360 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
12370 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
12380 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
12390 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
123a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
123b0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
123c0 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
123d0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
123e0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
123f0 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
12400 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
12410 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
12420 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
12430 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
12440 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
12450 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
12460 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
12470 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
12480 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
12490 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
124a0 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
124b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
124c0 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
124d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
124e0 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
124f0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
12500 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
12510 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
12520 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
12530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12540 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
12550 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
12560 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12570 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
12580 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
12590 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
125a0 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
125b0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
125c0 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
125d0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
125e0 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
125f0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
12600 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
12610 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
12620 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12650 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12680 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
12690 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
126a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
126b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
126c0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
126f0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
12700 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
12710 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
12720 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
12730 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
12740 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
12750 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
12760 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
12770 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
12780 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12790 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
127a0 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
127b0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
127c0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
127d0 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
127e0 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
127f0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
12800 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
12810 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12820 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
12830 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
12840 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
12850 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
12860 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
12870 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
12880 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
12890 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  imit;.  regLimit
128a0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
128b0 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
128c0 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
128d0 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c  mit = 0;.  p->iL
128e0 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  imit = p->iOffse
128f0 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42  t = 0;.  pOrderB
12900 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
12910 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
12920 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
12930 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20 74  of the Current t
12940 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
12950 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63  0; ALWAYS(i<pSrc
12960 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20  ->nSrc); i++){. 
12970 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69     if( pSrc->a[i
12980 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ].fg.isRecursive
12990 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
129a0 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
129b0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
129c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
129d0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
129e0 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
129f0 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
12a00 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
12a10 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
12a20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
12a30 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
12a40 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
12a50 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
12a60 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
12a70 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 20  he SRT_DistFifo 
12a80 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65 75  and SRT_DistQueu
12a90 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74  e destinations t
12aa0 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75  o work. */.  iQu
12ab0 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  eue = pParse->nT
12ac0 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  ab++;.  if( p->o
12ad0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
12ae0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
12af0 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51 75  rBy ? SRT_DistQu
12b00 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46 69  eue : SRT_DistFi
12b10 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63  fo;.    iDistinc
12b20 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
12b30 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
12b40 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42   eDest = pOrderB
12b50 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20  y ? SRT_Queue : 
12b60 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20 20  SRT_Fifo;.  }.  
12b70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
12b80 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65  tInit(&destQueue
12b90 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29  , eDest, iQueue)
12ba0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
12bb0 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72   cursors for Cur
12bc0 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64  rent, Queue, and
12bd0 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20   Distinct. */.  
12be0 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70  regCurrent = ++p
12bf0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
12c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12c10 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
12c20 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67  o, iCurrent, reg
12c30 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a  Current, nCol);.
12c40 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
12c50 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
12c60 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53  KeyInfo = multiS
12c70 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
12c80 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
12c90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12ca0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
12cb0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
12cc0 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
12cd0 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
12d00 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
12d10 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
12d20 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
12d30 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
12d40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12d50 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
12d60 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
12d70 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
12d80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
12d90 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
12da0 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
12db0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
12dc0 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
12dd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12de0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
12df0 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
12e00 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
12e10 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
12e20 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  al;.  }..  /* De
12e30 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
12e40 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  Y clause from th
12e50 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
12e60 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72  T */.  p->pOrder
12e70 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74  By = 0;..  /* St
12e80 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12e90 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
12ea0 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
12eb0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
12ec0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
12ed0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12ee0 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74 51  , pSetup, &destQ
12ef0 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d  ueue);.  pSetup-
12f00 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66  >pNext = p;.  if
12f10 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
12f20 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65  of_recursive_que
12f30 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ry;..  /* Find t
12f40 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74  he next row in t
12f50 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74  he Queue and out
12f60 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a  put that row */.
12f70 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
12f80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12f90 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65   OP_Rewind, iQue
12fa0 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20  ue, addrBreak); 
12fb0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12fc0 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
12fd0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
12fe0 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75  Queue over to Cu
12ff0 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  rrent */.  sqlit
13000 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13010 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72  OP_NullRow, iCur
13020 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73  rent); /* To res
13030 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  et column cache 
13040 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
13050 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
13060 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13070 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c  _Column, iQueue,
13080 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
13090 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  +1, regCurrent);
130a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
130b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
130c0 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69  v, OP_RowData, i
130d0 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e  Queue, regCurren
130e0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
130f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
13100 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65  P_Delete, iQueue
13110 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  );..  /* Output 
13120 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
13130 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61  n Current */.  a
13140 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65  ddrCont = sqlite
13150 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13160 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  );.  codeOffset(
13170 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64  v, regOffset, ad
13180 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63  drCont);.  selec
13190 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
131a0 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a  e, p, iCurrent,.
131b0 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
131c0 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
131d0 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
131e0 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
131f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13200 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
13210 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61  ero, regLimit, a
13220 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
13230 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13240 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13250 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13260 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
13270 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
13280 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
13290 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
132a0 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
132b0 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
132c0 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
132d0 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
132e0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
132f0 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
13300 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
13310 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
13320 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13330 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13340 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72 65  "recursive aggre
13350 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74  gate queries not
13360 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20   supported");.  
13370 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50  }else{.    p->pP
13380 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71  rior = 0;.    sq
13390 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
133a0 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75  se, p, &destQueu
133b0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
133c0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
133d0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
133e0 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f  pSetup;.  }..  /
133f0 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
13400 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
13410 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
13420 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
13430 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70  eGoto(v, addrTop
13440 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13450 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13460 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64  addrBreak);..end
13470 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
13480 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  ery:.  sqlite3Ex
13490 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
134a0 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64  rse->db, p->pOrd
134b0 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64  erBy);.  p->pOrd
134c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
134d0 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  .  p->pLimit = p
134e0 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e 3b  Limit;.  return;
134f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13500 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
13510 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
13520 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
13530 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
13540 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
13550 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13560 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13570 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13580 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13590 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
135a0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
135b0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
135c0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
135d0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
135e0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
135f0 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
13600 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
13610 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
13620 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
13630 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
13640 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
13650 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
13660 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
13670 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
13680 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
13690 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
136a0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
136b0 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
136c0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
136d0 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
136e0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
136f0 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
13700 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
13710 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
13720 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
13730 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65 20  .**   (1) There 
13740 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f  is no LIMIT or O
13750 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74 68  FFSET or else th
13760 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 6f  ere is a LIMIT o
13770 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20 20  f exactly 1.**  
13780 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61   (2) All terms a
13790 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20  re UNION ALL.** 
137a0 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20 6e    (3) There is n
137b0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
137c0 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49 4d  e.**.** The "LIM
137d0 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 22  IT of exactly 1"
137e0 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74 69   case of conditi
137f0 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62 6f  on (1) comes abo
13800 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45 53  ut when a VALUES
13810 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75 72  .** clause occur
13820 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72 20  s within scalar 
13830 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a 20  expression (ex: 
13840 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53 28  "SELECT (VALUES(
13850 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a 2a  1),(2),(3))")..*
13860 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f 64  * The sqlite3Cod
13870 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c 20  eSubselect will 
13880 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20 4c  have added the L
13890 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69 6e  IMIT 1 clause in
138a0 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53 69   tht case..** Si
138b0 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69 73  nce the limit is
138c0 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20 6f   exactly 1, we o
138d0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61 6c  nly need to eval
138e0 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  utes the left-mo
138f0 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73 74  st VALUES..*/.st
13900 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
13910 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61  lectValues(.  Pa
13920 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13930 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
13940 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
13950 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
13960 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
13970 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
13980 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
13990 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
139a0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
139b0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
139c0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
139d0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20  elect *pPrior;. 
139e0 20 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 6d   Select *pRightm
139f0 6f 73 74 20 3d 20 70 3b 0a 20 20 69 6e 74 20 6e  ost = p;.  int n
13a00 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
13a10 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
13a20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
13a30 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
13a40 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
13a50 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
13a60 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
13a70 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13a80 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
13a90 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
13aa0 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
13ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13ac0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45  Next==0 || p->pE
13ad0 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e  List->nExpr==p->
13ae0 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
13af0 45 78 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20  Expr );.    if( 
13b00 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62  p->pPrior==0 ) b
13b10 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74  reak;.    assert
13b20 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  ( p->pPrior->pNe
13b30 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d  xt==p );.    p =
13b40 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
13b50 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  nRow++;.  }while
13b60 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  (1);.  while( p 
13b70 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  ){.    pPrior = 
13b80 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
13b90 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
13bb0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
13bc0 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  pDest);.    p->p
13bd0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
13be0 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20 70 52      if( rc || pR
13bf0 69 67 68 74 6d 6f 73 74 2d 3e 70 4c 69 6d 69 74  ightmost->pLimit
13c00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d   ) break;.    p-
13c10 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52  >nSelectRow = nR
13c20 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  ow;.    p = p->p
13c30 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
13c40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13c50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13c60 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
13c70 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
13c80 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
13c90 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
13ca0 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
13cb0 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
13cc0 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
13cd0 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
13ce0 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
13cf0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
13d00 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
13d10 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
13d20 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
13d30 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
13d40 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
13d50 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
13d60 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
13d70 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
13d80 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
13d90 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
13da0 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
13db0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
13dc0 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
13dd0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
13de0 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
13df0 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
13e00 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
13e10 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
13e20 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
13e30 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
13e40 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
13e50 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
13e60 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
13e70 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
13e80 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
13e90 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
13ea0 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
13eb0 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
13ec0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
13ed0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
13ee0 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
13ef0 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
13f00 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
13f10 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
13f20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
13f30 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
13f40 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
13f50 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
13f60 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
13f70 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
13f80 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
13f90 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
13fa0 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
13fb0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
13fc0 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
13fd0 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
13fe0 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
13ff0 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
14000 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
14010 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
14020 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
14030 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
14040 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
14050 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
14060 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
14070 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
14080 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
14090 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
140a0 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
140b0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
140c0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
140d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
140e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
140f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
14100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14110 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
14120 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
14130 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
14140 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
14150 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
14160 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
14170 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
14180 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
14190 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
141a0 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
141b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
141c0 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
141d0 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
141e0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
141f0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
14200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14210 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14220 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
14230 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
14240 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
14250 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
14260 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
14270 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
14280 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
14290 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
142a0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
142b0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
142c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
142d0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
142e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
142f0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
14300 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
14310 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
14320 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
14330 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
14340 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
14350 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
14360 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
14370 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
14380 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
14390 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
143a0 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
143b0 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
143c0 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
143d0 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
143e0 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
143f0 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
14400 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
14410 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
14420 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
14430 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
14440 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
14450 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
14460 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
14470 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
14480 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
14490 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
144a0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
144b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
144c0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
144d0 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
144e0 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
144f0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
14500 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
14510 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14520 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
14530 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
14540 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
14550 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
14560 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
14570 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
14580 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
14590 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
145a0 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
145b0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
145c0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
145d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
145e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
145f0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
14600 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
14610 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
14620 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
14630 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
14640 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
14650 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
14660 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
14670 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
14680 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
14690 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
146a0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
146b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
146c0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
146d0 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
146e0 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
146f0 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
14700 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
14710 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
14720 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
14730 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
14740 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
14750 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
14760 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
14770 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
14780 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
14790 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
147a0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
147b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
147c0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
147d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
147e0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
147f0 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
14800 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
14810 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
14820 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
14830 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
14840 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
14850 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
14860 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
14870 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
14880 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14890 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
148a0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
148b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
148c0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
148d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
148e0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
148f0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
14900 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
14910 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
14920 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
14930 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
14940 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
14950 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
14960 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
14970 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
14980 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
14990 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
149a0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
149b0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
149c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
149d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
149e0 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
149f0 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
14a00 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
14a10 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
14a20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
14a30 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
14a40 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
14a50 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
14a60 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
14a70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
14a80 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
14a90 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
14aa0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
14ab0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
14ac0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
14ad0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
14ae0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14af0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
14b00 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14b10 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14b20 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14b30 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
14b40 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
14b50 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14b60 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14b70 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
14b80 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
14b90 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
14ba0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
14bb0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
14bc0 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
14bd0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
14be0 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
14bf0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
14c00 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
14c10 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
14c20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
14c30 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  Not, p->iLimit);
14c40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
14c50 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
14c60 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
14c70 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
14c80 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
14c90 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65     if( p->iOffse
14ca0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
14cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14cc0 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
14cd0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cf0 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f  p->iLimit, p->iO
14d00 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66  ffset+1, p->iOff
14d10 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
14d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
14d30 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14d40 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
14d50 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
14d60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14d70 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14d80 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
14d90 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
14da0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
14db0 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14dc0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14dd0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14de0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
14df0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
14e00 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
14e10 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
14e20 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
14e30 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
14e40 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
14e50 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
14e60 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
14e70 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d  it->pLeft, &nLim
14e80 69 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c  it).       && nL
14e90 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65  imit>0 && p->nSe
14ea0 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69 74 65  lectRow > sqlite
14eb0 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
14ec0 6d 69 74 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  mit) .      ){. 
14ed0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
14ee0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
14ef0 67 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74  gEst((u64)nLimit
14f00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f10 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20   if( addr ){.   
14f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14f30 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
14f40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14f60 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54    case TK_EXCEPT
14f70 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e  :.    case TK_UN
14f80 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
14f90 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a   unionTab;    /*
14fa0 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
14fb0 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
14fc0 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65  table holding re
14fd0 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75 38  sult */.      u8
14fe0 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   op = 0;       /
14ff0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54  * One of the SRT
15000 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  _ operations to 
15010 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f  apply to self */
15020 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
15030 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53  Op;     /* The S
15040 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  RT_ operation to
15050 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20   apply to prior 
15060 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  selects */.     
15070 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
15080 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
15090 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20  s of p->nLimit  
150a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
150b0 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
150c0 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
150d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
150e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
150f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15100 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
15110 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
15120 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
15130 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
15140 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
15150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
15160 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
15170 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
15180 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
15190 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
151a0 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
151b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
151c0 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
151d0 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
151e0 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
151f0 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
15200 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
15210 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61  Tab = dest.iSDPa
15220 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rm;.      }else{
15230 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77  .        /* We w
15240 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61  ill need to crea
15250 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f  te our own tempo
15260 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f  rary table to ho
15270 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ld the.        *
15280 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
15290 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20  esults..        
152a0 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  */.        union
152b0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
152c0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ab++;.        as
152d0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
152e0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
152f0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15300 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15310 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e  penEphemeral, un
15320 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
15330 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
15340 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15350 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
15360 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15370 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
15380 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
15390 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
153a0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
153b0 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
153c0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
153d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
153e0 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
153f0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
15400 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
15410 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
15420 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
15430 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
15440 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
15450 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
15460 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
15470 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15480 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
15490 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
154a0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
154b0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
154c0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
154d0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
154e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
154f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
15500 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
15510 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
15520 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
15530 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15540 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15550 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
15560 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
15570 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
15580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
155a0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
155b0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
155c0 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
155d0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
155e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
155f0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
15600 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
15610 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e  = 0;.      union
15620 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
15630 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15640 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15650 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15660 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
15670 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
15680 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69  (pParse, p, &uni
15690 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  ondest);.      t
156a0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
156b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
156c0 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e  /* Query flatten
156d0 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65  ing in sqlite3Se
156e0 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66  lect() might ref
156f0 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e  ill p->pOrderBy.
15700 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72  .      ** Be sur
15710 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70  e to delete p->p
15720 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f  OrderBy, therefo
15730 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  re, to avoid a m
15740 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20  emory leak. */. 
15750 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
15760 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
15770 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
15780 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
15790 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
157a0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
157b0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
157c0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
157d0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
157e0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ON ){.        p-
157f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
15800 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
15810 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
15820 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
15830 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15840 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15850 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
15860 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
15870 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
15880 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
15890 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
158a0 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  et = 0;..      /
158b0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61  * Convert the da
158c0 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  ta in the tempor
158d0 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77  ary table into w
158e0 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20  hatever form.   
158f0 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
15900 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
15910 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
15920 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e     assert( union
15930 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72  Tab==dest.iSDPar
15940 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21  m || dest.eDest!
15950 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20  =priorOp );.    
15960 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
15970 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20  !=priorOp ){.   
15980 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
15990 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
159a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
159b0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
159c0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
159d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
159e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
159f0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
15a00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15a10 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
15a20 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
15a30 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
15a40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15a50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15a60 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
15a70 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
15a80 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15a90 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
15aa0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15ab0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15ac0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
15ad0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69  p(pParse, p, uni
15ae0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
15b00 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
15b10 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
15b20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15b30 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15b40 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
15b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15b60 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
15b70 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
15b80 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15b90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ba0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15bb0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15bc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
15be0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
15bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15c00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15c10 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
15c20 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
15c30 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
15c40 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
15c50 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
15c60 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
15c70 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
15c80 69 6d 69 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  imit;.      int 
15c90 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
15ca0 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
15cb0 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
15cc0 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
15cd0 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
15ce0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
15cf0 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
15d00 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
15d10 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
15d20 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
15d30 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
15d40 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
15d50 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
15d60 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
15d70 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
15d80 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
15d90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
15da0 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
15db0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15dc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
15dd0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
15de0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15df0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15e00 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
15e10 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
15e20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
15e30 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
15e40 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
15e50 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
15e60 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
15e70 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
15e80 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
15e90 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
15ea0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
15eb0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
15ec0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
15ed0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
15ee0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
15ef0 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
15f00 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
15f10 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
15f20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
15f30 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
15f40 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
15f50 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
15f60 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15f70 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15f80 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15f90 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
15fa0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
15fb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
15fc0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15fd0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15fe0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15ff0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
16000 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
16010 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
16020 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
16030 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
16040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16050 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
16060 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
16070 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
16080 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
16090 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
160a0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
160b0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
160c0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
160d0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
160e0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
160f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
16100 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
16110 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
16120 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
16130 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
16140 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
16150 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
16160 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
16170 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
16180 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
16190 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
161a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
161b0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
161c0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
161d0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
161e0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
161f0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
16200 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
16210 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
16220 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
16230 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
16240 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
16250 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
16260 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
16270 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Limit;..      /*
16280 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
16290 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
162a0 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
162b0 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
162c0 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
162d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
162e0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
162f0 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d  ;.      iBreak =
16300 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16310 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
16320 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
16330 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16340 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69  .      computeLi
16350 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
16360 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
16370 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16390 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72  ewind, tab1, iBr
163a0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
163b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20  ge(v);.      r1 
163c0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
163d0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
163e0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
163f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16400 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62   OP_RowData, tab
16410 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
16420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
16430 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
16440 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
16450 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
16460 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
16470 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16480 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
16490 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
164a0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
164b0 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20  p, tab1,.       
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
164d0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
164e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
164f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
16500 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
16510 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
16520 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16530 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
16540 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
16550 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
16560 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
16570 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
16580 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16590 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
165a0 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
165b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
165c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
165d0 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
165e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
165f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61    }.  }..  expla
16600 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
16610 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
16620 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d  , iSub2, p->op!=
16630 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43  TK_ALL);..  /* C
16640 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67  ompute collating
16650 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20   sequences used 
16660 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  by .  ** tempora
16670 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64  ry tables needed
16680 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
16690 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
166a0 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74  t..  ** Attach t
166b0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
166c0 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70  ture to all temp
166d0 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20  orary tables..  
166e0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63  **.  ** This sec
166f0 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74  tion is run by t
16700 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
16710 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
16720 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54  nly..  ** SELECT
16730 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
16740 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73  he left always s
16750 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20  kip this part.  
16760 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  The right-most. 
16770 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74   ** SELECT might
16780 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20   also skip this 
16790 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e  part if it has n
167a0 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  o ORDER BY claus
167b0 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65  e and.  ** no te
167c0 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65  mp tables are re
167d0 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  quired..  */.  i
167e0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
167f0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
16800 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  l ){.    int i; 
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
16830 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65  ounter */.    Ke
16840 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16860 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16870 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  e for the result
16880 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65   set */.    Sele
16890 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  ct *pLoop;      
168a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
168b0 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
168c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
168d0 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65  ts */.    CollSe
168e0 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20  q **apColl;     
168f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
16900 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70  ooping through p
16910 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d  KeyInfo->aColl[]
16920 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   */.    int nCol
16930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16940 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16950 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  of columns in re
16960 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20  sult set */..   
16970 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
16980 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==0 );.    nCol
16990 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
169a0 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
169b0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
169c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c  foAlloc(db, nCol
169d0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , 1);.    if( !p
169e0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
169f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
16a00 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
16a10 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
16a20 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
16a30 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
16a40 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
16a50 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
16a60 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
16a70 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
16a80 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
16a90 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
16aa0 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
16ab0 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
16ac0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
16ad0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
16ae0 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
16af0 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
16b00 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
16b10 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16b20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
16b30 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
16b40 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
16b50 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
16b60 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
16b70 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
16b80 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
16b90 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
16ba0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
16bb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
16bc0 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
16bd0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
16be0 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
16bf0 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
16c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
16c10 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
16c20 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
16c30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16c40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
16c50 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
16c60 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
16c70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16c80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
16c90 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c  addr, (char*)sql
16ca0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
16cb0 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20  KeyInfo),.      
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
16ce0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
16cf0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
16d00 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
16d10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16d20 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
16d30 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
16d40 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
16d50 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
16d60 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70   dest.iSdst;.  p
16d70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65  Dest->nSdst = de
16d80 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69  st.nSdst;.  sqli
16d90 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
16da0 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
16db0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16dc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16dd0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
16de0 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72  CT */../*.** Err
16df0 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 77  or message for w
16e00 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  hen two or more 
16e10 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70 6f  terms of a compo
16e20 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65 20  und select have 
16e30 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69 7a  different.** siz
16e40 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 2a  e result sets..*
16e50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
16e60 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
16e70 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70 50  sError(Parse *pP
16e80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
16e90 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  {.  if( p->selFl
16ea0 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
16eb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16ec0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16ed0 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20  all VALUES must 
16ee0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
16ef0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b  mber of terms");
16f00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
16f10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
16f20 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
16f30 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
16f40 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
16f50 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20    " do not have 
16f60 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16f70 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
16f80 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  s", selectOpName
16f90 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a  (p->op));.  }.}.
16fa0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
16fb0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
16fc0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
16fd0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16fe0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
16ff0 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
17000 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
17010 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
17020 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
17030 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
17040 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
17050 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
17060 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
17070 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
17080 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
17090 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
170a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
170b0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
170c0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
170d0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
170e0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
170f0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
17100 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
17110 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
17120 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
17130 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
17140 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
17150 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
17160 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
17170 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
17180 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
17190 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
171a0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
171b0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
171c0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
171d0 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
171e0 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
171f0 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
17200 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
17210 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
17220 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
17230 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
17240 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
17250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
17260 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
17270 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
17280 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17290 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
172a0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
172b0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
172c0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
172d0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
172e0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
172f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
17300 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
17310 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
17320 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
17330 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
17340 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
17350 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
17360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
17370 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
17380 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
17390 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
173a0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
173b0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
173c0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
173d0 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
173e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
173f0 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
17400 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
17410 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
17420 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
17430 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
17440 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
17450 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
17460 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
17470 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
17480 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
17490 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
174a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
174b0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
174c0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
174d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
174e0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
174f0 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
17500 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
17510 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
17520 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
17530 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
17540 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72 31  addr2;.    addr1
17550 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17560 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
17570 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
17580 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17590 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
175a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
175b0 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
175c0 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
175d0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
17600 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
17610 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
17620 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
17630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17640 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
17650 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65  dr2+2, iContinue
17660 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62 65  , addr2+2); Vdbe
17670 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17680 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17690 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
176a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
176b0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
176c0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
176d0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
176e0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
176f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17700 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
17710 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
17720 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
17730 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
17740 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
17750 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
17760 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
17770 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
17780 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
17790 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
177a0 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
177b0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73  Continue);..  as
177c0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
177d0 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
177e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73  ;.  assert( pDes
177f0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61  t->eDest!=SRT_Ta
17800 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28  ble );.  switch(
17810 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
17820 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
17830 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
17840 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
17850 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
17860 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
17870 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
17880 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
17890 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
178a0 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
178b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
178c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
178d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
178e0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
178f0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  d, pIn->iSdst, p
17900 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a  In->nSdst, r1);.
17910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
17930 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69  wRowid, pDest->i
17940 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20  SDParm, r2);.   
17950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17960 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
17970 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
17980 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
17990 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
179a0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
179b0 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73  APPEND);.      s
179c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
179d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
179e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
179f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17a00 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
17a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
17a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17a30 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
17a40 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
17a50 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
17a60 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
17a70 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a  ECT ...)"..    *
17a80 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
17a90 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
17aa0 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r1;.      testca
17ab0 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e 31  se( pIn->nSdst>1
17ac0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
17ad0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17ae0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17af0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17b00 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
17b10 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
17b20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20 20  pIn->nSdst, .   
17b30 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
17b40 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e 2d  ->zAffSdst, pIn-
17b50 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
17b60 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
17b70 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
17b80 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17b90 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17ba0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17bb0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
17bc0 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
17bd0 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a 20  ->iSDParm, r1,. 
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 69            pIn->i
17c00 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17c20 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17c30 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
17c40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17c50 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
17c60 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
17c70 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
17c80 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
17c90 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
17ca0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
17cb0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
17cc0 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
17cd0 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
17ce0 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
17cf0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
17d00 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
17d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
17d20 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20 70  n->nSdst==1 || p
17d30 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
17d40 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d    testcase( pIn-
17d50 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20 20  >nSdst!=1 );.   
17d60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17d70 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
17d80 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
17d90 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20  ->iSDParm, 1);. 
17da0 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
17db0 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
17dc0 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
17dd0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
17de0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17df0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
17e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17e10 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
17e20 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
17e30 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
17e40 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
17e50 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
17e60 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53  ing at pDest->iS
17e70 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63  dst.  Then the c
17e80 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73  o-routine yields
17e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17ea0 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
17eb0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65   {.      if( pDe
17ec0 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a  st->iSdst==0 ){.
17ed0 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69          pDest->i
17ee0 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65  Sdst = sqlite3Ge
17ef0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
17f00 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  e, pIn->nSdst);.
17f10 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e          pDest->n
17f20 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73  Sdst = pIn->nSds
17f30 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
17f40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17f50 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
17f60 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
17f70 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17f80 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17f90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17fa0 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
17fb0 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
17fc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
17fd0 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
17fe0 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
17ff0 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
18000 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
18010 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
18020 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
18030 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
18040 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
18050 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
18060 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
18070 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
18080 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
18090 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
180a0 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
180b0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
180c0 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
180d0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
180e0 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
180f0 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
18100 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
18110 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
18120 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
18130 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
18140 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
18150 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
18160 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
18170 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
18180 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
18190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
181a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
181b0 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
181c0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
181d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
181e0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
181f0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
18200 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
18210 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
18220 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
18230 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
18240 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
18250 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
18260 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
18270 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
18280 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
18290 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
182a0 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c  rJumpZero, p->iL
182b0 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
182c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
182d0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
182e0 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
182f0 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
18300 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
18310 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
18320 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
18330 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18340 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
18350 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
18360 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
18370 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
18380 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
18390 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
183a0 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
183b0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
183c0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
183d0 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
183e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
183f0 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
18400 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
18410 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
18420 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
18430 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
18440 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
18450 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
18460 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
18470 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
18480 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
18490 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
184a0 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
184b0 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
184c0 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
184d0 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
184e0 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
184f0 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
18500 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
18510 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
18520 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
18530 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
18540 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
18550 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
18560 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
18570 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
18580 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
18590 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
185a0 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
185b0 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
185c0 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
185d0 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
185e0 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
185f0 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
18600 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    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 42 20 63 6f 72   the selectB 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 20 20 28 4f  pound query.  (O
18670 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
18680 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
18690 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
186a0 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
186b0 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
186c0 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
186d0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
186e0 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
186f0 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
18700 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
18710 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
18720 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
18730 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
18740 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
18750 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18760 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
18770 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
18780 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
18790 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
187a0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
187b0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
187c0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
187d0 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
187e0 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
187f0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
18800 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
18810 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
18820 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
18830 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
18840 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
18850 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
18860 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
18870 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
18880 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
18890 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
188a0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
188b0 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
188c0 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
188d0 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
188e0 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
188f0 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
18900 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
18910 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
18920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18930 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
18940 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
18950 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
18960 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
18970 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
18980 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18990 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
189a0 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
189b0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
189c0 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
189d0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
189e0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
189f0 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
18a00 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
18a10 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18a20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
18a30 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
18a40 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
18a50 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
18a60 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
18a70 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
18a80 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
18a90 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
18aa0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
18ab0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
18ac0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
18ad0 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
18ae0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
18af0 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
18b00 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
18b10 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
18b20 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
18b30 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
18b40 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
18b50 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
18b60 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
18b70 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
18b80 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
18b90 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
18ba0 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
18bb0 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
18bc0 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
18bd0 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
18be0 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
18bf0 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
18c00 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
18c10 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
18c20 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
18c30 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
18c40 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
18c50 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
18c60 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
18c70 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
18c80 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
18c90 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
18ca0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
18cb0 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
18cc0 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
18cd0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
18ce0 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
18cf0 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
18d00 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
18d10 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
18d20 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
18d30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
18d40 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
18d50 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
18d60 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
18d70 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
18d80 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
18d90 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
18da0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
18db0 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
18dc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
18dd0 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
18de0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
18df0 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
18e00 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
18e10 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
18e20 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
18e30 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
18e40 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
18e50 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
18e60 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
18e70 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
18e80 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
18e90 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
18ea0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
18eb0 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
18ec0 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
18ed0 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
18ee0 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
18ef0 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
18f00 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
18f10 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
18f20 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
18f30 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
18f40 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
18f50 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
18f60 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
18f70 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
18f80 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
18f90 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
18fa0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
18fb0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
18fc0 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
18fd0 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
18fe0 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
18ff0 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
19000 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
19010 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
19020 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
19030 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
19040 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
19050 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
19060 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
19070 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
19080 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
19090 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
190a0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
190b0 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
190c0 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
190d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
190e0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
190f0 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
19100 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
19110 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
19120 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
19130 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
19140 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
19150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19160 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
19170 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
19180 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
19190 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
191a0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
191b0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
191c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
191d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
191e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
191f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
19200 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
19210 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
19220 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
19230 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
19240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19250 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
19260 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
19270 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
19280 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
19290 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
192a0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
192b0 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
192c0 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
192d0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
192e0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
192f0 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
19300 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
19310 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
19320 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19330 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
19340 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
19350 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
19360 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
19370 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
19380 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  A;      /* Addre
19390 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
193a0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
193b0 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74    int addrSelect
193c0 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  B;      /* Addre
193d0 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
193e0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
193f0 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20    int regOutA;  
19400 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19410 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
19420 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
19430 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19440 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20   regOutB;       
19450 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
19460 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
19470 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
19480 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
19490 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  OutA;         /*
194a0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
194b0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
194c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
194d0 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f  rOutB = 0;     /
194e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
194f0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
19500 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19510 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20  drEofA;         
19520 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19530 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75  e select-A-exhau
19540 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
19550 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19560 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c  A_noB;     /* Al
19570 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41  ternate addrEofA
19580 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69   if B is uniniti
19590 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
195a0 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
195b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
195c0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
195d0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
195e0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
195f0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
19600 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19610 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
19620 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
19630 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
19640 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
19650 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19660 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
19670 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19680 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
19690 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
196a0 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
196b0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
196c0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
196d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
196e0 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
196f0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
19700 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
19710 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
19720 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
19730 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
19740 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
19750 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
19760 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
19770 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
19780 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
19790 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
197a0 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
197b0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
197c0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
197d0 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
197e0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
197f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
19800 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
19810 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
19820 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
19830 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
19840 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
19850 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
19860 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
19870 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
19880 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
19890 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
198a0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
198c0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
198d0 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
198e0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
198f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
19900 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61  up = 0; /* Compa
19910 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
19920 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
19930 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
19940 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
19950 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
19960 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19970 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
19980 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
19990 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
199a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
199b0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
199c0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
199d0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
199e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
199f0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
19a00 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
19a10 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
19a20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
19a30 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
19a40 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
19a50 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
19a60 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
19a70 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65  olumns */.#ifnde
19a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
19a90 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
19aa0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
19ab0 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
19ac0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
19ad0 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
19ae0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
19af0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
19b00 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
19b10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
19b20 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73  erBy!=0 );.  ass
19b30 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20  ert( pKeyDup==0 
19b40 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20  ); /* "Managed" 
19b50 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e  code needs this.
19b60 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20    Ticket #3382. 
19b70 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  */.  db = pParse
19b80 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72  ->db;.  v = pPar
19b90 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
19ba0 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20  ert( v!=0 );    
19bb0 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68     /* Already th
19bc0 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69  rown the error i
19bd0 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69  f VDBE alloc fai
19be0 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e  led */.  labelEn
19bf0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
19c00 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c  akeLabel(v);.  l
19c10 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74  abelCmpr = sqlit
19c20 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19c30 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68  v);...  /* Patch
19c40 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59   up the ORDER BY
19c50 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f   clause.  */.  o
19c60 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70  p = p->op;  .  p
19c70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
19c80 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
19c90 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ior->pOrderBy==0
19ca0 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   );.  pOrderBy =
19cb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
19cc0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
19cd0 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d   );.  nOrderBy =
19ce0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
19cf0 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72  ;..  /* For oper
19d00 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e  ators other than
19d10 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61   UNION ALL we ha
19d20 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ve to make sure 
19d30 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52  that.  ** the OR
19d40 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f  DER BY clause co
19d50 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20  vers every term 
19d60 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
19d70 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72  t.  Add.  ** ter
19d80 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ms to the ORDER 
19d90 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63  BY clause as nec
19da0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
19db0 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op!=TK_ALL ){
19dc0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62  .    for(i=1; db
19dd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
19de0 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73  0 && i<=p->pELis
19df0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
19e00 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
19e10 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
19e20 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  m;.      for(j=0
19e30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
19e40 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b  ->a; j<nOrderBy;
19e50 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
19e60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19e70 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19e80 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19e90 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75      if( pItem->u
19ea0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
19eb0 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  i ) break;.     
19ec0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d   }.      if( j==
19ed0 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
19ee0 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
19ef0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
19f00 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
19f10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
19f20 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  w==0 ) return SQ
19f30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19f40 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
19f50 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
19f60 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
19f70 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
19f80 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  .        p->pOrd
19f90 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 20  erBy = pOrderBy 
19fa0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
19fb0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
19fc0 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
19fd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
19fe0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
19ff0 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
1a000 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
1a010 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
1a020 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1a030 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
1a040 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
1a050 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
1a060 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
1a070 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
1a080 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
1a090 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
1a0a0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
1a0b0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
1a0c0 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
1a0d0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
1a0e0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
1a0f0 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
1a100 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1a110 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
1a120 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
1a130 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
1a140 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
1a150 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
1a160 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
1a170 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
1a180 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
1a190 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
1a1a0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
1a1b0 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28  b, sizeof(int)*(
1a1c0 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b 0a  nOrderBy + 1));.
1a1d0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
1a1e0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
1a1f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1a200 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65 5b  m;.    aPermute[
1a210 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  0] = nOrderBy;. 
1a220 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74 65     for(i=1, pIte
1a230 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
1a240 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  <=nOrderBy; i++,
1a250 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1a260 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1a270 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
1a280 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1a290 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1a2a0 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45  rderByCol<=p->pE
1a2b0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
1a2c0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
1a2d0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
1a2e0 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
1a2f0 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
1a300 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
1a310 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
1a320 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
1a330 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
1a340 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
1a350 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
1a360 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a370 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
1a380 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
1a390 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1a3a0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1a3b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1a3c0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
1a3d0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
1a3e0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
1a3f0 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
1a400 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
1a410 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
1a420 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
1a430 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
1a440 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
1a450 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
1a460 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
1a470 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
1a480 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
1a490 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
1a4a0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
1a4b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a4c0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
1a4d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1a4e0 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
1a4f0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
1a500 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
1a510 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
1a520 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1a530 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
1a540 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
1a550 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
1a560 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
1a570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a580 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
1a590 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
1a5a0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
1a5b0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
1a5c0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
1a5d0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
1a5e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
1a5f0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
1a600 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
1a610 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1a620 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
1a630 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1a640 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
1a650 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
1a660 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
1a670 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
1a680 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a690 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1a6a0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
1a6b0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
1a6c0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
1a6d0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
1a6e0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
1a6f0 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
1a700 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
1a710 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
1a720 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1a730 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1a740 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
1a750 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
1a760 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
1a770 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
1a780 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
1a790 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
1a7a0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
1a7b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
1a7c0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
1a7d0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
1a7e0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
1a7f0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
1a800 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
1a810 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
1a820 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
1a830 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
1a840 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
1a850 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
1a860 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1a870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a880 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
1a890 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
1a8a0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
1a8b0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
1a8e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a8f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a900 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
1a910 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
1a920 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
1a930 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
1a940 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
1a950 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a960 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
1a970 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 72  pLimit = 0;..  r
1a980 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
1a990 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
1a9a0 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
1a9b0 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
1a9c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a9d0 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
1a9e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a9f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1aa00 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
1aa10 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1aa20 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1aa30 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1aa40 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
1aa50 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1aa60 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1aa70 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1aa80 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1aa90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1aaa0 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
1aab0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1aac0 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
1aad0 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
1aae0 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
1aaf0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1ab00 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1ab10 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1ab20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ab30 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1ab40 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
1ab50 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
1ab60 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
1ab70 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
1ab80 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
1ab90 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
1aba0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1abb0 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
1abc0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1abd0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1abe0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
1abf0 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
1ac00 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1ac10 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  e(v, regAddrA);.
1ac20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1ac30 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1ac40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ac50 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1ac60 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1ac70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
1ac80 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
1ac90 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
1aca0 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1acb0 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
1acc0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1acd0 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1ace0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1acf0 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1ad00 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
1ad10 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
1ad20 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1ad30 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
1ad40 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
1ad50 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
1ad60 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
1ad70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
1ad80 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1ad90 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
1ada0 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
1adb0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
1adc0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
1add0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
1ade0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1adf0 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
1ae00 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
1ae10 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
1ae20 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
1ae30 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
1ae40 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
1ae50 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
1ae60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ae70 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1ae80 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1ae90 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
1aea0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1aeb0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1aec0 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1aed0 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1aee0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1aef0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1af00 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
1af10 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
1af20 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
1af30 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
1af50 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
1af60 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
1af70 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
1af80 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
1af90 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
1afa0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1afb0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1afc0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
1afd0 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
1afe0 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
1aff0 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
1b000 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
1b010 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
1b020 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1b030 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1b040 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1b050 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1b060 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
1b070 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
1b080 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1b090 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1b0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b0b0 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
1b0c0 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1b0e0 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1b0f0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20  labelEnd);.  }. 
1b100 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
1b110 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a  nref(pKeyDup);..
1b120 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1b130 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1b140 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1b150 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
1b160 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1b170 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1b180 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
1b190 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1b1a0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
1b1b0 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
1b1c0 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
1b1d0 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f  ofA_noB = addrEo
1b1e0 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20  fA = labelEnd;. 
1b1f0 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1b200 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b210 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
1b220 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1b230 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
1b240 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b250 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1b260 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64  ddrOutB);.    ad
1b270 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c  drEofA_noB = sql
1b280 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b290 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1b2a0 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrB, labelEnd);
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b2e0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1b2f0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
1b300 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e  drEofA);.    p->
1b310 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
1b320 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
1b330 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
1b340 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
1b350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1b360 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1b370 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1b380 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1b390 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
1b3a0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1b3b0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1b3c0 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
1b3d0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1b3e0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1b3f0 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
1b400 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d  EofA;.    if( p-
1b410 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50  >nSelectRow > pP
1b420 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1b430 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
1b440 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
1b450 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20  ctRow;.  }else{ 
1b460 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
1b470 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
1b480 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1b490 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
1b4a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b4b0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b4c0 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1b4d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b4e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b4f0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c  eld, regAddrA, l
1b500 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f  abelEnd); VdbeCo
1b510 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b520 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b530 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
1b540 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b550 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1b560 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
1b570 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1b580 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
1b590 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1b5a0 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
1b5b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b5c0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b5d0 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1b5e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b5f0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b600 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b610 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1b620 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1b630 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1b640 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
1b650 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b660 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1b670 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
1b680 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1b690 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1b6a0 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
1b6b0 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
1b6c0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1b6d0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1b6e0 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
1b6f0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1b700 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b710 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
1b720 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1b730 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
1b740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b750 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b760 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1b770 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1b790 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1b7a0 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
1b7b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b7c0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1b7d0 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
1b7e0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b7f0 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
1b800 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1b810 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
1b820 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1b830 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
1b840 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1b850 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
1b860 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b870 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1b880 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
1b890 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b8a0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b8b0 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1b8c0 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1b8d0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1b8e0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1b8f0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
1b900 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
1b910 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
1b920 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
1b930 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1b940 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1b950 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b960 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b970 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b980 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62  drEofA_noB); Vdb
1b990 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b9a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b9b0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b9c0 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1b9d0 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1b9e0 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  (v);..  /* Imple
1b9f0 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
1ba00 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
1ba10 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1ba20 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1ba30 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
1ba40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ba50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
1ba60 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
1ba70 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
1ba80 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
1ba90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1baa0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
1bab0 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
1bac0 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1baf0 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
1bb00 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
1bb10 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
1bb20 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
1bb30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bb40 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
1bb50 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
1bb60 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64  B, addrAgtB); Vd
1bb70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1bb80 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
1bb90 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
1bba0 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
1bbb0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
1bbc0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1bbd0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1bbe0 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
1bbf0 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
1bc00 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
1bc10 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1bc20 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
1bc30 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
1bc40 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
1bc50 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1bc60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1bc70 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1bc80 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
1bc90 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1bca0 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  rior;.  pPrior->
1bcb0 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a  pNext = p;..  /*
1bcc0 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
1bcd0 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
1bce0 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
1bcf0 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
1bd00 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
1bd10 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
1bd20 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
1bd30 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
1bd40 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
1bd50 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1bd60 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1bd70 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1bd80 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1bd90 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1bda0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1bdb0 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1bdc0 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1bdd0 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1bde0 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1bdf0 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1be00 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1be10 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1be20 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1be30 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1be40 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1be50 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1be60 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1be70 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1be80 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1be90 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1bea0 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1beb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1bec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bed0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1bee0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1bef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bf00 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1bf10 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1bf20 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1bf30 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1bf40 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1bf50 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1bf60 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1bf70 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1bf80 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1bf90 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1bfa0 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1bfb0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1bfc0 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1bfd0 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1bfe0 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1bff0 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1c000 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1c010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1c020 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1c030 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1c040 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1c050 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1c060 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1c070 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1c080 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1c090 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1c0a0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1c0b0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1c0c0 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1c0d0 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1c0e0 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1c0f0 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1c100 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1c110 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1c120 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1c130 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1c140 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1c150 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1c160 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1c170 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1c180 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1c190 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1c1a0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1c1b0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1c1c0 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1c1d0 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1c1e0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1c1f0 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1c200 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1c210 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1c220 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1c230 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1c240 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1c250 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1c260 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1c270 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1c280 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1c290 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1c2a0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1c2b0 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1c2c0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1c2d0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1c2e0 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1c2f0 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1c300 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1c310 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c320 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1c330 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1c340 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1c350 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1c360 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1c370 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1c380 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1c390 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1c3a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1c3b0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1c3c0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1c3d0 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1c3e0 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1c3f0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1c400 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1c410 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1c420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1c430 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1c440 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1c450 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1c460 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1c470 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1c480 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1c490 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1c4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1c4b0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1c4c0 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1c4d0 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1c4e0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1c4f0 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1c500 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1c510 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1c520 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1c530 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1c540 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1c550 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1c560 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1c570 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1c580 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1c590 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1c5a0 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29  rIsVector(pCopy)
1c5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c5c0 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
1c5d0 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  g(pSubst->pParse
1c5e0 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , pCopy);.      
1c5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1c600 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75  qlite3 *db = pSu
1c610 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  bst->pParse->db;
1c620 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1c630 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1c640 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b  && pCopy->op!=TK
1c650 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1c660 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e       memset(&ifN
1c670 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f  ullRow, 0, sizeo
1c680 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20  f(ifNullRow));. 
1c690 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1c6a0 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55  ow.op = TK_IF_NU
1c6b0 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  LL_ROW;.        
1c6c0 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66    ifNullRow.pLef
1c6d0 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  t = pCopy;.     
1c6e0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69       ifNullRow.i
1c6f0 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1c700 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20  iNewTable;.     
1c710 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66       pCopy = &if
1c720 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20  NullRow;.       
1c730 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20   }.        pNew 
1c740 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1c750 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1c760 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1c770 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1c780 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1c790 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1c7a0 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1c7b0 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1c7c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1c7d0 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1c7e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1c7f0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1c800 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1c810 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1c820 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1c830 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1c840 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1c850 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1c860 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1c870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c880 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1c890 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1c8a0 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1c8b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1c8c0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1c8d0 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1c8e0 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1c8f0 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1c900 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1c910 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1c920 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1c930 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1c940 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1c950 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1c960 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1c970 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1c980 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1c990 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1c9a0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1c9b0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1c9c0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1c9d0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1c9e0 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1c9f0 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1ca00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ca10 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ca20 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ca30 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1ca40 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1ca50 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1ca60 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1ca70 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1ca80 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1ca90 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1caa0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1cab0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1cac0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1cad0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1cae0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1caf0 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1cb00 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1cb10 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1cb20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1cb30 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1cb40 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1cb50 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1cb60 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1cb70 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1cb80 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1cb90 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1cba0 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1cbb0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1cbc0 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1cbd0 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1cbe0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1cbf0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1cc00 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1cc10 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1cc20 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1cc30 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1cc40 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1cc50 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1cc60 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1cc70 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1cc80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1cc90 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1cca0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1ccb0 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1ccc0 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1ccd0 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1cce0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1ccf0 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1cd00 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1cd10 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1cd20 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1cd30 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1cd40 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1cd50 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1cd60 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1cd70 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1cd80 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1cd90 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1cda0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1cdb0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1cdc0 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1cdd0 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1cde0 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1cdf0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1ce00 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1ce10 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1ce20 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1ce30 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1ce40 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1ce50 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1ce60 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1ce70 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1ce80 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1ce90 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1cea0 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1ceb0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1cec0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1ced0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1cee0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cef0 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1cf00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1cf10 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1cf20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1cf30 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1cf40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1cf50 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1cf60 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1cf70 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1cf80 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1cf90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1cfa0 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1cfb0 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1cfc0 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1cfd0 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1cfe0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1cff0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1d000 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1d010 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1d020 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1d030 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1d040 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1d050 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1d060 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1d070 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1d080 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1d090 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1d0a0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1d0b0 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1d0c0 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1d0d0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1d0e0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1d0f0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1d100 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1d110 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1d120 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1d130 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1d140 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1d150 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1d160 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1d170 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1d180 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1d190 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1d1a0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1d1b0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1d1c0 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1d1d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d1e0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1d1f0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1d200 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1d210 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1d220 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1d230 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1d240 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1d250 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1d260 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1d270 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1d280 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1d290 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1d2a0 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1d2b0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1d2c0 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1d2d0 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1d2e0 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1d2f0 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1d300 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1d310 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1d320 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1d330 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1d340 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1d350 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1d360 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1d370 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1d380 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1d390 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1d3a0 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1d3b0 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1d3c0 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1d3d0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1d3e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1d3f0 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1d400 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1d410 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1d420 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1d430 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1d440 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1d450 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1d460 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d470 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1d480 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1d490 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1d4a0 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1d4b0 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1d4c0 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1d4d0 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1d4e0 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1d4f0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1d500 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1d510 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1d520 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1d530 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1d540 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1d550 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1d560 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1d570 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1d580 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1d590 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1d5a0 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1d5b0 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1d5c0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1d5d0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1d5e0 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1d5f0 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1d600 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1d610 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1d620 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1d630 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1d640 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d650 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1d660 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1d670 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1d680 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1d690 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1d6a0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1d6b0 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1d6c0 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1d6d0 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1d6e0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1d6f0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1d700 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1d710 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1d720 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1d730 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1d740 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1d750 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1d760 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1d770 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1d780 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1d790 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1d7a0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1d7b0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1d7c0 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1d7d0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1d7e0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1d7f0 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1d800 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1d810 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1d820 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1d830 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1d840 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1d850 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1d860 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1d870 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1d880 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1d890 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1d8a0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1d8b0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1d8c0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1d8d0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1d8e0 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1d8f0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1d900 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1d910 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1d920 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1d930 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1d940 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1d950 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1d960 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1d970 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d980 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1d990 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1d9a0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1d9b0 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1d9c0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d9d0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1d9e0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1d9f0 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1da00 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1da10 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1da20 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1da30 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1da40 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1da50 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1da60 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1da70 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1da80 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1da90 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1daa0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1dab0 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
1dac0 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1dad0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1dae0 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1daf0 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1db00 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1db10 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1db20 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1db30 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
1db40 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1db50 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1db60 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1db70 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1db80 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1db90 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1dba0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1dbb0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1dbc0 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1dbd0 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1dbe0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1dbf0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1dc00 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1dc10 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1dc20 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1dc30 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1dc40 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
1dc50 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
1dc60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1dc70 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
1dc80 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1dc90 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
1dca0 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
1dcb0 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
1dcc0 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1dcd0 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1dce0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1dcf0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1dd00 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1dd10 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1dd20 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
1dd30 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
1dd40 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
1dd50 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1dd60 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1dd70 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1dd80 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1dd90 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1dda0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1ddb0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1ddc0 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
1ddd0 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
1dde0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1ddf0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
1de00 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
1de10 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
1de20 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
1de30 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
1de40 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
1de50 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
1de60 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
1de70 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
1de80 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
1de90 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
1dea0 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
1deb0 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
1dec0 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
1ded0 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
1dee0 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
1def0 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
1df00 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1df10 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
1df20 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
1df30 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
1df40 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
1df50 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1df70 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
1df80 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1df90 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1dfa0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1dfb0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1dfc0 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1dfd0 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1dfe0 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1dff0 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1e000 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1e010 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1e020 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1e030 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1e040 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1e050 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1e060 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1e070 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1e080 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1e090 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1e0a0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1e0b0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1e0c0 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1e0d0 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1e0e0 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1e0f0 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1e100 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1e110 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1e120 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1e130 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1e140 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1e150 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1e160 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1e170 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1e180 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1e190 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1e1a0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1e1b0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1e1c0 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1e1d0 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1e1e0 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1e1f0 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1e200 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1e210 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1e220 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1e230 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1e240 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1e250 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1e260 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1e270 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1e280 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1e290 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1e2a0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1e2b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1e2c0 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
1e2d0 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1e2e0 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1e2f0 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1e300 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1e310 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1e320 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
1e330 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1e340 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1e350 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1e360 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1e370 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
1e380 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
1e390 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1e3a0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1e3b0 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
1e3c0 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1e3d0 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
1e3e0 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
1e3f0 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
1e400 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
1e410 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
1e420 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
1e430 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
1e440 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1e450 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
1e460 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
1e470 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
1e480 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
1e490 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1e4a0 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
1e4b0 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
1e4c0 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
1e4d0 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
1e4e0 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
1e4f0 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
1e500 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
1e510 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
1e520 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1e530 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
1e540 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1e550 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1e560 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1e570 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1e580 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
1e590 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
1e5a0 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
1e5b0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1e5c0 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
1e5d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e5e0 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
1e5f0 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
1e600 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
1e610 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
1e620 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1e630 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
1e640 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1e650 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1e660 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1e670 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1e680 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1e690 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1e6a0 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1e6b0 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1e6c0 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1e6d0 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1e6e0 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1e6f0 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1e700 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1e710 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
1e720 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1e730 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1e740 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
1e750 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1e760 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1e770 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1e780 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1e790 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1e7a0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1e7b0 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
1e7c0 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
1e7d0 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
1e7e0 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
1e7f0 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
1e800 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
1e810 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
1e820 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
1e830 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
1e840 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1e850 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1e860 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1e870 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1e880 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1e890 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1e8a0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1e8b0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1e8c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1e8d0 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1e8e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1e8f0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1e900 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1e910 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1e920 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1e930 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1e940 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1e950 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e960 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1e970 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1e980 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1e990 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1e9a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1e9b0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1e9c0 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1e9d0 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1e9e0 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1e9f0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1ea00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1ea10 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1ea20 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1ea30 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1ea40 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1ea50 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1ea60 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1ea70 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1ea80 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1ea90 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1eaa0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1eab0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
1eac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1ead0 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1eae0 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1eaf0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1eb00 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1eb10 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
1eb20 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
1eb30 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
1eb40 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
1eb50 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
1eb60 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
1eb70 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
1eb80 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
1eb90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
1eba0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
1ebb0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
1ebc0 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
1ebd0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
1ebe0 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
1ebf0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
1ec00 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1ec10 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
1ec20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1ec30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
1ec40 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
1ec50 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
1ec60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1ec70 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1ec80 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1ec90 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1eca0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1ecb0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1ecc0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1ecd0 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
1ece0 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
1ecf0 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
1ed00 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
1ed10 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
1ed20 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
1ed30 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
1ed40 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1ed50 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1ed80 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1edb0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1edc0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1edd0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1ede0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1edf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ee00 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1ee10 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ee20 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1ee30 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1ee40 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1ee50 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1ee60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1ee70 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
1ee80 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
1ee90 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
1eea0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
1eeb0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
1eec0 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1eed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1eee0 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
1eef0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
1ef00 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
1ef10 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
1ef20 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
1ef30 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
1ef40 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
1ef50 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
1ef60 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
1ef70 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  ;..  pSubSrc = p
1ef80 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1ef90 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1efa0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1efb0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1efc0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1efd0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1efe0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1eff0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1f000 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1f010 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1f020 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1f030 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1f040 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1f050 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1f060 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1f070 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1f080 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1f090 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1f0a0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1f0b0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1f0c0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1f0d0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1f0e0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1f0f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f100 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1f110 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f120 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f130 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1f140 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f150 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
1f160 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
1f170 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f180 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1f190 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f1a0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1f1b0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1f1c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f200 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1f210 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1f220 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1f230 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f250 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1f260 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1f270 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f280 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1f290 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1f2a0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
1f2b0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1f2c0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1f2d0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1f2e0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1f2f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1f300 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1f310 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1f320 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1f330 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f340 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1f350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f380 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1f390 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1f3a0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1f3b0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f3e0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1f3f0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1f400 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1f410 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f420 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1f430 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1f440 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1f450 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f460 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1f470 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1f480 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f490 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1f4a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1f4b0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
1f4c0 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
1f4d0 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
1f4e0 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
1f4f0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
1f500 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f510 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1f520 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1f530 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
1f540 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
1f550 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
1f560 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
1f570 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
1f580 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
1f590 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1f5a0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1f5b0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1f5c0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1f5d0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1f5e0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1f5f0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1f600 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1f610 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1f620 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1f630 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1f640 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1f650 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
1f660 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1f670 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1f680 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1f690 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
1f6a0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
1f6b0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
1f6c0 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
1f6d0 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
1f6e0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
1f6f0 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
1f700 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
1f710 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
1f720 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1f730 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
1f740 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
1f750 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
1f760 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
1f770 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
1f780 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
1f790 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
1f7a0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
1f7b0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
1f7c0 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
1f7d0 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
1f7e0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
1f7f0 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
1f800 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
1f810 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
1f820 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
1f830 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
1f840 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
1f850 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1f860 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1f870 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
1f880 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
1f890 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
1f8a0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
1f8b0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
1f8c0 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
1f8d0 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
1f8e0 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
1f8f0 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
1f900 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
1f910 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
1f920 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
1f930 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
1f940 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
1f950 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
1f960 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
1f970 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
1f980 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
1f990 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
1f9a0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
1f9b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1f9c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f9d0 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
1f9e0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f9f0 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1fa00 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1fa10 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1fa20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1fa30 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1fa40 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1fa50 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1fa60 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1fa70 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1fa80 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1fa90 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1faa0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1fab0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1fac0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1fad0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1fae0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1faf0 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1fb00 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
1fb10 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
1fb20 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
1fb30 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1fb40 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
1fb50 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
1fb60 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
1fb70 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
1fb80 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
1fb90 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
1fba0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
1fbb0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
1fbc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
1fbd0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1fbe0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1fbf0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1fc00 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
1fc10 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1fc20 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1fc30 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1fc40 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1fc50 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
1fc60 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
1fc70 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
1fc80 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1fc90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
1fca0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
1fcb0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
1fcc0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1fcd0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1fce0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1fcf0 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
1fd00 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
1fd10 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1fd20 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
1fd50 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1fd60 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
1fd90 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
1fda0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fdb0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1fdc0 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
1fdd0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
1fde0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1fdf0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
1fe00 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1fe10 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1fe20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1fe30 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
1fe40 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
1fe50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
1fe60 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
1fe70 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
1fe80 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
1fe90 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1fea0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
1feb0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
1fec0 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
1fed0 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
1fee0 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
1fef0 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
1ff00 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
1ff10 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
1ff20 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
1ff30 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
1ff40 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
1ff50 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1ff60 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
1ff70 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
1ff80 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
1ff90 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
1ffa0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
1ffb0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
1ffc0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
1ffd0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1ffe0 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
1fff0 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
20000 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
20010 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
20020 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
20030 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
20040 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
20050 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
20060 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
20070 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
20080 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
20090 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
200a0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
200b0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
200c0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
200d0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
200e0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
200f0 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
20100 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
20110 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
20120 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
20130 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
20140 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
20150 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
20160 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
20170 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
20180 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
20190 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
201a0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
201b0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
201c0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
201d0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
201e0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
201f0 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
20200 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
20210 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
20220 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
20230 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
20240 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
20250 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
20260 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
20270 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
20280 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
20290 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
202a0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
202b0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
202c0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
202d0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
202e0 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
202f0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
20300 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
20310 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
20320 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
20330 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
20340 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
20350 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
20360 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
20370 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
20380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
20390 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
203a0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
203b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
203c0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
203d0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
203e0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
203f0 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
20400 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
20410 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
20420 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
20430 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
20440 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
20450 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
20460 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
20470 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
20480 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
20490 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
204a0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
204b0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
204c0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
204d0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
204e0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
204f0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
20500 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
20510 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
20520 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
20530 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
20540 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
20550 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
20560 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
20570 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
20580 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
20590 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
205a0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
205b0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
205c0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
205d0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
205e0 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
205f0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
20600 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
20610 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
20620 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
20630 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
20640 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
20650 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
20660 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
20670 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
20680 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
20690 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
206a0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
206b0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
206c0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
206d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
206e0 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
206f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
20700 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
20710 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
20720 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
20730 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
20740 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
20750 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
20760 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
20770 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
20780 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
20790 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
207a0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
207b0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
207c0 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
207d0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
207e0 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
207f0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
20800 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
20810 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
20820 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
20830 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
20840 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
20850 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
20860 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
20870 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
20880 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
20890 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
208a0 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
208b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
208c0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
208d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
208e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
208f0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
20900 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
20910 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
20920 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
20930 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
20940 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
20950 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
20960 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
20970 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
20980 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20990 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
209a0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
209b0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
209c0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
209d0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
209e0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
209f0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
20a00 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
20a10 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
20a20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
20a30 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
20a40 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
20a50 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
20a60 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
20a70 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
20a80 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
20a90 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
20aa0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
20ab0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
20ac0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
20ad0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
20ae0 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
20af0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
20b00 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
20b10 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
20b20 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
20b30 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
20b40 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
20b50 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
20b60 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
20b70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
20b80 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
20b90 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
20ba0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
20bb0 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
20bc0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
20bd0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
20be0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
20bf0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
20c00 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
20c10 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
20c20 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
20c30 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
20c40 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
20c50 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
20c60 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
20c70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
20c80 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
20c90 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
20ca0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
20cb0 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
20cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
20cd0 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
20ce0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
20cf0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
20d00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
20d10 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
20d20 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
20d30 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
20d40 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
20d50 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
20d60 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
20d70 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
20d80 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
20d90 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
20da0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
20db0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
20dc0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
20dd0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
20de0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
20df0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
20e00 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
20e10 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
20e20 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
20e30 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
20e40 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
20e50 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
20e60 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
20e70 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
20e80 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
20e90 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
20ea0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
20eb0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
20ec0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
20ed0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
20ee0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
20ef0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
20f00 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
20f10 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
20f20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
20f30 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
20f40 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
20f50 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
20f60 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
20f70 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
20f80 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
20f90 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
20fa0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
20fb0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
20fc0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
20fd0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
20fe0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
20ff0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
21000 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
21010 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
21020 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
21030 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
21040 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
21050 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
21060 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
21070 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
21080 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
21090 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
210a0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
210b0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
210c0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
210d0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
210e0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
210f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
21100 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
21110 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
21120 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
21130 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
21140 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
21150 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
21160 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
21170 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
21180 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
21190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
211a0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
211b0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
211c0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
211d0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
211e0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
211f0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
21200 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
21210 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
21220 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
21230 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
21240 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
21250 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
21260 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21280 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21290 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
212a0 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
212b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
212c0 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
212d0 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
212e0 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
212f0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
21300 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
21310 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
21320 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
21330 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
21340 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
21350 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
21360 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
21370 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
21380 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
21390 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
213a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
213b0 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
213c0 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
213d0 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
213e0 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
213f0 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
21400 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
21410 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
21420 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
21430 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
21440 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
21450 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
21460 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
21470 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
21480 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
21490 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
214a0 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f   clause to 4 slo
214b0 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d  ts..    ** The m
214c0 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78  iddle slot is ex
214d0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
214e0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
214f0 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a  make space.    *
21500 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c  * for the two el
21510 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
21520 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21530 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
21540 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
21550 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
21560 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
21570 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
21580 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
21590 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
215a0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
215b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
215c0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
215d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
215e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
215f0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
21600 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
21610 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
21620 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
21630 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
21640 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21650 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
21660 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
21670 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
21680 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
21690 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
216a0 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
216b0 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
216c0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
216d0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
216e0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
216f0 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74        iNewParent
21700 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
21710 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
21720 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
21730 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
21740 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
21750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
21760 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
21770 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
21780 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
21790 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
217a0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
217b0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
217c0 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
217d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
217e0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
217f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
21800 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
21810 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
21820 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
21830 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
21840 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
21850 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
21860 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
21870 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
21880 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
21890 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
218a0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
218b0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
218c0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
218d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
218e0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
218f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21900 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
21910 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
21920 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
21930 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
21940 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
21950 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
21960 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
21970 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
21980 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
21990 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
219a0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
219b0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
219c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
219d0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
219e0 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
219f0 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
21a00 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
21a10 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
21a20 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
21a30 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
21a40 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
21a50 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
21a60 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
21a70 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
21a80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
21a90 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
21aa0 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
21ab0 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
21ac0 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
21ad0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
21ae0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
21af0 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
21b00 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
21b10 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
21b20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21b30 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21b40 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
21b50 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
21b60 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
21b70 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
21b80 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
21b90 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
21ba0 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
21bb0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
21bc0 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
21bd0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
21be0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
21bf0 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
21c00 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
21c10 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
21c20 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
21c30 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
21c40 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
21c50 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
21c60 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
21c70 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
21c80 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21c90 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
21ca0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
21cb0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21cc0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
21cd0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21ce0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21cf0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
21d00 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21d10 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
21d20 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
21d30 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
21d40 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72  .    }.    pWher
21d50 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
21d60 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
21d70 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ere, 0);.    if(
21d80 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b   isLeftJoin>0 ){
21d90 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  .      setJoinEx
21da0 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77 50  pr(pWhere, iNewP
21db0 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
21dc0 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
21dd0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
21de0 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
21df0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b  Parent->pWhere);
21e00 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
21e10 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
21e20 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65        SubstConte
21e30 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50  xt x;.      x.pP
21e40 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
21e50 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
21e60 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  iParent;.      x
21e70 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65  .iNewTable = iNe
21e80 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78  wParent;.      x
21e90 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73  .isLeftJoin = is
21ea0 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20  LeftJoin;.      
21eb0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d  x.pEList = pSub-
21ec0 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  >pEList;.      s
21ed0 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70  ubstSelect(&x, p
21ee0 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  Parent, 0);.    
21ef0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
21f00 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
21f10 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
21f20 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
21f30 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
21f40 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
21f50 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
21f60 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
21f70 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
21f80 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
21f90 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
21fa0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
21fb0 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
21fc0 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
21fd0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
21fe0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
21ff0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
22000 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
22010 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
22020 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
22030 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
22040 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
22050 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
22060 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
22070 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
22080 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
22090 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
220a0 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
220b0 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
220c0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
220d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
220e0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
220f0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
22100 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
22110 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
22120 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
22130 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
22140 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c  pSub1);..#if SEL
22150 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
22160 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
22170 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
22180 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
22190 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
221a0 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74  e,p,("After flat
221b0 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20  tening:\n"));.  
221c0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
221d0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
221e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
221f0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
22200 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
22210 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
22220 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
22230 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
22240 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  W) */....#if !de
22250 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
22260 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
22270 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22280 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
22290 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72  Make copies of r
222a0 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c  elevant WHERE cl
222b0 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68  ause terms of th
222c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e  e outer query in
222d0 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  to.** the WHERE 
222e0 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
222f0 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ry.  Example:.**
22300 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
22310 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41  FROM (SELECT a A
22320 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52  S x, c-d AS y FR
22330 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35  OM t1) WHERE x=5
22340 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
22350 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
22360 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  o:.**.**    SELE
22370 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
22380 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53  T a AS x, c-d AS
22390 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
223a0 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29   a=5 AND c-d=10)
223b0 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d  .**     WHERE x=
223c0 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
223d0 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68  * The hope is th
223e0 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64  at the terms add
223f0 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20  ed to the inner 
22400 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20  query will make 
22410 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63  it more.** effic
22420 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  ient..**.** Do n
22430 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20  ot attempt this 
22440 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a  optimization if:
22450 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a  .**.**   (1) (**
22460 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
22470 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e  n was removed on
22480 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57 65   2017-09-29.  We
22490 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20   used to.**     
224a0 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20 74        disallow t
224b0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
224c0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 73   for aggregate s
224d0 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20 6e  ubqueries, but n
224e0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
224f0 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62 79  it is allowed by
22500 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78 74   putting the ext
22510 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  ra terms on the 
22520 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a  HAVING clause..*
22530 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20  *           The 
22540 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c 61  added HAVING cla
22550 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73 73  use is pointless
22560 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
22570 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20   lacks.**       
22580 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20 63      a GROUP BY c
22590 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63 68  lause.  But such
225a0 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
225b0 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73   is also harmles
225c0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 73  s.**           s
225d0 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f 74  o there does not
225e0 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61 6e   appear to be an
225f0 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64 20  y reason to add 
22600 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20  extra logic.**  
22610 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70 70           to supp
22620 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a  ress it. **).**.
22630 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e 6e  **   (2) The inn
22640 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
22650 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20 6f  recursive part o
22660 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  f a common table
22670 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
22680 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e 6e  **   (3) The inn
22690 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20 4c  er query has a L
226a0 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69 6e  IMIT clause (sin
226b0 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  ce the changes t
226c0 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 20  o the WHERE.**  
226d0 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64       close would
226e0 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61 6e   change the mean
226f0 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49 54  ing of the LIMIT
22700 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54  )..**.**   (4) T
22710 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
22720 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
22730 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
22740 49 4e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20  IN and the.**   
22750 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 20 74      expression t
22760 6f 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e  o be pushed down
22770 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66   does not come f
22780 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
22790 65 0a 2a 2a 20 20 20 20 20 20 20 6f 6e 20 74 68  e.**       on th
227a0 61 74 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a  at LEFT JOIN..**
227b0 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57 48  .**   (5) The WH
227c0 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
227d0 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73  ssion originates
227e0 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
227f0 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20  ING clause.**   
22800 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f      of a LEFT JO
22810 49 4e 20 77 68 65 72 65 20 69 43 75 72 73 6f 72  IN where iCursor
22820 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
22830 74 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20  t-hand table of 
22840 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65  that.**       le
22850 66 74 20 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61  ft join.  An exa
22860 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
22870 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a        SELECT *.*
22880 2a 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d  *           FROM
22890 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 61 31   (SELECT 1 AS a1
228a0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
228b0 54 20 32 29 20 41 53 20 61 61 0a 2a 2a 20 20 20  T 2) AS aa.**   
228c0 20 20 20 20 20 20 20 20 4a 4f 49 4e 20 28 53 45          JOIN (SE
228d0 4c 45 43 54 20 31 20 41 53 20 62 32 20 55 4e 49  LECT 1 AS b2 UNI
228e0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32 29  ON ALL SELECT 2)
228f0 20 41 53 20 62 62 20 4f 4e 20 28 61 31 3d 62 32   AS bb ON (a1=b2
22900 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4c  ).**           L
22910 45 46 54 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54  EFT JOIN (SELECT
22920 20 38 20 41 53 20 63 33 20 55 4e 49 4f 4e 20 41   8 AS c3 UNION A
22930 4c 4c 20 53 45 4c 45 43 54 20 39 29 20 41 53 20  LL SELECT 9) AS 
22940 63 63 20 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a  cc ON (b2=2);.**
22950 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 63 6f  .**       The co
22960 72 72 65 63 74 20 61 6e 73 77 65 72 20 69 73 20  rrect answer is 
22970 74 68 72 65 65 20 72 6f 77 73 3a 20 20 28 31 2c  three rows:  (1,
22980 31 2c 4e 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c  1,NULL),(2,2,8),
22990 28 32 2c 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20  (2,2,9)..**     
229a0 20 20 42 75 74 20 69 66 20 74 68 65 20 28 62 32    But if the (b2
229b0 3d 32 29 20 74 65 72 6d 20 77 65 72 65 20 74 6f  =2) term were to
229c0 20 62 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20   be pushed down 
229d0 69 6e 74 6f 20 74 68 65 20 62 62 20 73 75 62 71  into the bb subq
229e0 75 65 72 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74  uery,.**       t
229f0 68 65 6e 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c  hen the (1,1,NUL
22a00 4c 29 20 72 6f 77 20 77 6f 75 6c 64 20 62 65 20  L) row would be 
22a10 73 75 70 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a  suppressed..**.*
22a20 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f  * Return 0 if no
22a30 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
22a40 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  e and non-zero i
22a50 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48  f one or more WH
22a60 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ERE clause.** te
22a70 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
22a80 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71  ed into the subq
22a90 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
22aa0 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72  int pushDownWher
22ab0 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20  eTerms(.  Parse 
22ac0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
22ad0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
22ae0 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61   (for malloc() a
22af0 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  nd error reporti
22b00 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ng) */.  Select 
22b10 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f  *pSubq,        /
22b20 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77  * The subquery w
22b30 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73  hose WHERE claus
22b40 65 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65  e is to be augme
22b50 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nted */.  Expr *
22b60 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
22b70 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
22b80 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
22b90 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
22ba0 69 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20  iCursor,        
22bb0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
22bc0 65 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  er of the subque
22bd0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  ry */.  int isLe
22be0 66 74 4a 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a  ftJoin        /*
22bf0 20 54 72 75 65 20 69 66 20 70 53 75 62 71 20 69   True if pSubq i
22c00 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
22c10 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
22c20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
22c30 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20  ew;.  int nChng 
22c40 3d 20 30 3b 0a 20 20 69 66 28 20 70 57 68 65 72  = 0;.  if( pWher
22c50 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
22c60 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65  .  if( pSubq->se
22c70 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22c80 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30  rsive ) return 0
22c90 3b 20 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  ;  /* restrictio
22ca0 6e 20 28 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66  n (2) */..#ifdef
22cb0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
22cc0 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  /* Only the firs
22cd0 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
22ce0 6f 75 6e 64 20 63 61 6e 20 68 61 76 65 20 61 20  ound can have a 
22cf0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 20 42 75  WITH clause.  Bu
22d00 74 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65  t make.  ** sure
22d10 20 6e 6f 20 6f 74 68 65 72 20 74 65 72 6d 73 20   no other terms 
22d20 61 72 65 20 6d 61 72 6b 65 64 20 53 46 5f 52 65  are marked SF_Re
22d30 63 75 72 73 69 76 65 20 69 6e 20 63 61 73 65 20  cursive in case 
22d40 73 6f 6d 65 74 68 69 6e 67 20 63 68 61 6e 67 65  something change
22d50 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 75  s.  ** in the fu
22d60 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20  ture..  */.  {. 
22d70 20 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20     Select *pX;  
22d80 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 75 62  .    for(pX=pSub
22d90 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50  q; pX; pX=pX->pP
22da0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 61 73 73  rior){.      ass
22db0 65 72 74 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61  ert( (pX->selFla
22dc0 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
22dd0 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  ve))==0 );.    }
22de0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
22df0 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74  f( pSubq->pLimit
22e00 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
22e10 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
22e20 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20  ion (3) */.  }. 
22e30 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
22e40 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
22e50 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44    nChng += pushD
22e60 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
22e70 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68  arse, pSubq, pWh
22e80 65 72 65 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20  ere->pRight,.   
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75               iCu
22eb0 72 73 6f 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e  rsor, isLeftJoin
22ec0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
22ed0 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
22ee0 20 7d 0a 20 20 69 66 28 20 69 73 4c 65 66 74 4a   }.  if( isLeftJ
22ef0 6f 69 6e 0a 20 20 20 26 26 20 28 45 78 70 72 48  oin.   && (ExprH
22f00 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
22f10 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d  e,EP_FromJoin)==
22f20 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57  0.         || pW
22f30 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  here->iRightJoin
22f40 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a  Table!=iCursor).
22f50 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
22f60 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
22f70 6e 20 28 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69  n (4) */.  }.  i
22f80 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
22f90 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
22fa0 6d 4a 6f 69 6e 29 20 26 26 20 70 57 68 65 72 65  mJoin) && pWhere
22fb0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
22fc0 65 21 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e!=iCursor ){.  
22fd0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72    return 0; /* r
22fe0 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 2a  estriction (5) *
22ff0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  /.  }.  if( sqli
23000 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
23010 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
23020 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
23030 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
23040 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
23050 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
23060 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
23070 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
23080 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65  arse->db, pWhere
23090 2c 20 30 29 3b 0a 20 20 20 20 20 20 75 6e 73 65  , 0);.      unse
230a0 74 4a 6f 69 6e 45 78 70 72 28 70 4e 65 77 2c 20  tJoinExpr(pNew, 
230b0 2d 31 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  -1);.      x.pPa
230c0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
230d0 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
230e0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e  Cursor;.      x.
230f0 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72  iNewTable = iCur
23100 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c  sor;.      x.isL
23110 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20  eftJoin = 0;.   
23120 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53     x.pEList = pS
23130 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ubq->pEList;.   
23140 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
23150 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20  xpr(&x, pNew);. 
23160 20 20 20 20 20 69 66 28 20 70 53 75 62 71 2d 3e       if( pSubq->
23170 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
23180 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20  gregate ){.     
23190 20 20 20 70 53 75 62 71 2d 3e 70 48 61 76 69 6e     pSubq->pHavin
231a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
231b0 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
231c0 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70  Subq->pHaving, p
231d0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  New);.      }els
231e0 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  e{.        pSubq
231f0 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
23200 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
23210 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
23220 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
23230 20 20 7d 0a 20 20 20 20 20 20 70 53 75 62 71 20    }.      pSubq 
23240 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
23250 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23260 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
23270 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
23280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
23290 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
232a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
232b0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  EW) */../*.** Th
232c0 65 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 6f  e pFunc is the o
232d0 6e 6c 79 20 61 67 67 72 65 67 61 74 65 20 66 75  nly aggregate fu
232e0 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 71 75  nction in the qu
232f0 65 72 79 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  ery.  Check to s
23300 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 71 75 65  ee.** if the que
23310 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ry is a candidat
23320 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61  e for the min/ma
23330 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  x optimization. 
23340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  .**.** If the qu
23350 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
23360 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
23370 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
23380 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70   then set.** *pp
23390 4d 69 6e 4d 61 78 20 74 6f 20 62 65 20 61 6e 20  MinMax to be an 
233a0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
233b0 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  to be used for t
233c0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  he optimization.
233d0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 65 69  ** and return ei
233e0 74 68 65 72 20 57 48 45 52 45 5f 4f 52 44 45 52  ther WHERE_ORDER
233f0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
23400 4f 52 44 45 52 42 59 5f 4d 41 58 20 64 65 70 65  ORDERBY_MAX depe
23410 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74  nding on.** whet
23420 68 65 72 20 70 46 75 6e 63 20 69 73 20 61 20 6d  her pFunc is a m
23430 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 66 75  in() or max() fu
23440 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
23450 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6e 6f   the query is no
23460 74 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  t a candidate fo
23470 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
23480 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75  timization, retu
23490 72 6e 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45  rn.** WHERE_ORDE
234a0 52 42 59 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63  RBY_NORMAL (whic
234b0 68 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 29 2e  h must be zero).
234c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
234d0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
234e0 65 64 20 61 66 74 65 72 20 61 67 67 72 65 67 61  ed after aggrega
234f0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  te functions hav
23500 65 20 62 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65  e been.** locate
23510 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 65  d but before the
23520 69 72 20 61 72 67 75 6d 65 6e 74 73 20 68 61 76  ir arguments hav
23530 65 20 62 65 65 6e 20 73 75 62 6a 65 63 74 65 64  e been subjected
23540 20 74 6f 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   to aggregate.**
23550 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74   analysis..*/.st
23560 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
23570 65 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ery(sqlite3 *db,
23580 20 45 78 70 72 20 2a 70 46 75 6e 63 2c 20 45 78   Expr *pFunc, Ex
23590 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
235a0 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
235b0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
235c0 4f 52 4d 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52  ORMAL;      /* R
235d0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
235e0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
235f0 74 20 3d 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69  t = pFunc->x.pLi
23600 73 74 3b 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  st;    /* Argume
23610 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
23620 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
23630 68 61 72 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20  har *zFunc;     
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23650 2a 20 4e 61 6d 65 20 6f 66 20 61 67 67 72 65 67  * Name of aggreg
23660 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 70 46 75  ate function pFu
23670 6e 63 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  nc */.  ExprList
23680 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 75 38   *pOrderBy;.  u8
23690 20 73 6f 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61   sortOrder;..  a
236a0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
236b0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
236c0 20 70 46 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41   pFunc->op==TK_A
236d0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
236e0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
236f0 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
23700 3d 31 20 29 20 72 65 74 75 72 6e 20 65 52 65 74  =1 ) return eRet
23710 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e  ;.  zFunc = pFun
23720 63 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69  c->u.zToken;.  i
23730 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
23740 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
23750 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74 20 3d  =0 ){.    eRet =
23760 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
23770 49 4e 3b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65  IN;.    sortOrde
23780 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  r = SQLITE_SO_AS
23790 43 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  C;.  }else if( s
237a0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
237b0 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
237c0 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45  {.    eRet = WHE
237d0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
237e0 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
237f0 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a  SQLITE_SO_DESC;.
23800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
23810 75 72 6e 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20  urn eRet;.  }.  
23820 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64  *ppMinMax = pOrd
23830 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
23840 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
23850 4c 69 73 74 2c 20 30 29 3b 0a 20 20 61 73 73 65  List, 0);.  asse
23860 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
23870 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
23880 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4f 72  led );.  if( pOr
23890 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
238a0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
238b0 20 3d 20 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20   = sortOrder;.  
238c0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
238d0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
238e0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
238f0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
23900 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
23910 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
23920 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
23930 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
23940 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
23950 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
23960 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
23970 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
23980 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
23990 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
239a0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
239b0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
239c0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
239d0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
239e0 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
239f0 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
23a00 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
23a10 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
23a20 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
23a30 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
23a40 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
23a50 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
23a60 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
23a70 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
23a80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
23a90 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
23aa0 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
23ab0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
23ac0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
23ad0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
23ae0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
23af0 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
23b00 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
23b10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
23b20 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
23b30 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
23b40 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
23b50 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
23b60 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
23b70 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
23b80 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
23b90 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
23ba0 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
23bb0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
23bc0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
23bd0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
23be0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
23bf0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
23c00 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
23c10 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
23c20 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
23c30 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
23c40 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
23c50 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
23c60 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
23c70 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
23c80 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
23c90 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23ca0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
23cb0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
23cc0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
23cd0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
23ce0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
23cf0 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
23d00 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
23d10 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
23d20 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
23d30 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
23d40 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
23d50 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
23d60 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
23d70 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
23d80 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
23d90 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
23da0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
23db0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
23dc0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
23dd0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
23de0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
23df0 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
23e00 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
23e10 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
23e20 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
23e30 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
23e40 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
23e50 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
23e60 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
23e70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67  Tab && pFrom->fg
23e80 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
23e90 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
23ea0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
23eb0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
23ec0 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e  dBy = pFrom->u1.
23ed0 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20  zIndexedBy;.    
23ee0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
23ef0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
23f00 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
23f10 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
23f20 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
23f30 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29  ame, zIndexedBy)
23f40 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
23f50 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
23f60 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
23f70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23f80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23f90 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
23fa0 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42  : %s", zIndexedB
23fb0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  y, 0);.      pPa
23fc0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
23fd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
23fe0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
23ff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
24000 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64  ->pIBIndex = pId
24010 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
24020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
24030 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
24040 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
24050 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
24060 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
24070 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
24080 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
24090 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
240a0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
240b0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
240c0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
240d0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
240e0 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
240f0 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
24100 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
24110 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
24120 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
24130 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
24140 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
24150 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
24160 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
24170 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
24180 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
24190 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
241a0 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
241b0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
241c0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
241d0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
241e0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
241f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
24200 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
24210 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
24220 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
24230 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
24240 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
24250 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
24260 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
24270 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
24280 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
24290 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
242a0 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
242b0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
242c0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
242d0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
242e0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
242f0 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
24300 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
24310 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
24320 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
24330 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
24340 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
24350 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
24360 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
24370 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
24380 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
24390 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
243a0 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
243b0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
243c0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
243d0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
243e0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
243f0 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
24400 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
24410 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
24420 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
24430 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
24440 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
24450 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
24460 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
24470 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24480 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
24490 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
244a0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
244b0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
244c0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
244d0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
244e0 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
244f0 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
24500 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
24510 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
24520 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
24530 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
24540 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
24550 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
24560 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
24570 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
24580 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
24590 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
245a0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
245b0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
245c0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
245d0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
245e0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
245f0 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
24600 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
24610 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
24620 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
24630 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
24640 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
24650 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
24660 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
24670 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24680 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
24690 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
246a0 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
246b0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
246c0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
246d0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
246e0 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
246f0 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
24700 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24710 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
24720 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
24730 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
24740 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
24750 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
24760 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
24770 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
24780 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
24790 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
247a0 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
247b0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
247c0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
247d0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
247e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
247f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
24800 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
24810 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
24820 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
24830 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
24840 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
24850 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
24860 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
24870 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
24880 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
24890 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
248a0 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
248b0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
248c0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
248d0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  imit = 0;.  retu
248e0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
248f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
24900 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
24910 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
24920 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
24930 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
24940 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
24950 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
24960 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
24970 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
24980 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
24990 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
249a0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
249b0 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
249c0 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
249d0 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
249e0 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
249f0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
24a00 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
24a10 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
24a20 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
24a30 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
24a40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24a50 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
24a60 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
24a70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
24a80 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
24a90 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
24aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24ab0 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
24ac0 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
24ad0 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
24ae0 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
24af0 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
24b00 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
24b10 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
24b20 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
24b30 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
24b40 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
24b50 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
24b60 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
24b70 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
24b80 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
24b90 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
24ba0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
24bb0 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
24bc0 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
24bd0 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
24be0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
24bf0 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
24c00 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
24c10 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
24c20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
24c30 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
24c40 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
24c50 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
24c60 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
24c70 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
24c80 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
24c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ca0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
24cb0 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
24cc0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
24cd0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
24ce0 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
24cf0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
24d00 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
24d10 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d30 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
24d40 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
24d50 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
24d60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24d70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
24d80 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
24d90 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
24da0 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
24db0 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
24dc0 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
24dd0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
24de0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
24df0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
24e00 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
24e10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
24e20 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
24e30 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
24e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
24e50 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
24e60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
24e70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
24e80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
24e90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
24ea0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
24eb0 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
24ec0 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
24ed0 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
24ee0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
24ef0 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
24f00 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
24f10 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
24f20 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
24f30 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
24f40 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
24f50 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24f60 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
24f70 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
24f80 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
24f90 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
24fa0 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
24fb0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
24fc0 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
24fd0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
24fe0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
24ff0 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
25000 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
25010 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
25020 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
25030 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
25040 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
25050 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
25060 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
25070 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
25080 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
25090 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
250a0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
250b0 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
250c0 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
250d0 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
250e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
250f0 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
25100 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
25110 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
25120 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
25130 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
25140 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
25150 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
25160 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
25170 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
25180 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25190 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
251a0 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
251b0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
251c0 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
251d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
251e0 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
251f0 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
25200 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
25210 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
25220 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
25230 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
25240 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
25250 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
25260 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
25270 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
25280 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
25290 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
252a0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
252b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
252c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
252d0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
252e0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
252f0 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
25300 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
25310 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
25320 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
25330 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
25340 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
25350 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
25360 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
25370 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
25380 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
25390 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
253a0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
253b0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
253c0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
253d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
253e0 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
253f0 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
25400 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
25410 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
25420 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
25430 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
25440 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
25450 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
25460 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
25470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
25480 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
25490 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
254a0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
254b0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
254c0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
254d0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
254e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
254f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
25500 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25520 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
25530 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
25540 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
25550 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
25560 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
25570 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
25580 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
25590 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
255a0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
255b0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
255c0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
255d0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
255e0 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
255f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
25600 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
25610 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
25620 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
25630 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
25640 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
25650 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
25660 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
25670 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
25680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25690 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
256a0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
256b0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
256c0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
256d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
256e0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
256f0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
25700 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
25710 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
25720 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
25730 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
25740 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
25750 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
25760 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
25770 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
25780 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
25790 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
257a0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
257b0 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
257c0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
257d0 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
257e0 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
257f0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
25800 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
25810 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
25820 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25830 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25840 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
25850 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
25860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25870 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
25880 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
25890 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
258a0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
258b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
258c0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
258d0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
258e0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
258f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
25900 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
25910 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
25920 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
25930 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
25940 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
25950 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
25960 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
25970 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
25980 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
25990 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
259a0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
259b0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
259c0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
259d0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
259e0 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
259f0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
25a00 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
25a10 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
25a20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
25a30 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
25a40 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
25a50 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
25a60 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
25a70 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
25a80 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25a90 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25aa0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
25ab0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
25ac0 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
25ad0 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
25ae0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
25af0 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
25b00 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
25b10 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
25b20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
25b30 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
25b40 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
25b50 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
25b60 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
25b70 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
25b80 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
25b90 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
25ba0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
25bb0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
25bc0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
25bd0 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
25be0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
25bf0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
25c00 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
25c10 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
25c20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
25c30 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
25c40 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
25c50 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
25c60 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
25c70 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
25c80 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
25c90 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
25ca0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
25cb0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
25cc0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
25cd0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
25ce0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
25cf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25d00 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
25d10 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
25d20 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
25d30 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
25d40 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
25d50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25d60 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
25d70 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
25d80 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
25d90 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
25da0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
25db0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
25dc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25dd0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
25de0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
25df0 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
25e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70  .            ((p
25e10 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
25e20 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
25e30 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
25e40 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
25e50 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
25e60 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
25e70 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
25e80 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
25e90 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
25ea0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
25eb0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
25ec0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
25ed0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
25ee0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
25ef0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
25f00 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
25f10 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
25f20 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
25f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25f40 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25f50 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
25f60 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
25f70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
25f80 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25f90 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25fa0 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
25fb0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25fc0 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
25fd0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
25fe0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
25ff0 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
26000 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
26010 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
26020 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
26030 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
26040 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
26050 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
26060 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
26070 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26080 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
26090 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
260a0 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
260b0 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
260c0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
260d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
260e0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
260f0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
26100 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
26110 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
26120 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26130 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26140 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
26150 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
26160 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
26170 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
26180 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26190 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
261a0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
261b0 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
261c0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
261d0 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
261e0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
261f0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
26200 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
26210 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
26220 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
26230 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
26240 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
26250 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
26260 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
26270 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
26280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26290 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
262a0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
262b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
262c0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
262d0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
262e0 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
262f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
26300 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
26310 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26320 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
26330 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
26340 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26350 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
26360 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
26370 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
26380 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
26390 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
263a0 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
263b0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
263c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
263d0 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
263e0 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
263f0 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
26400 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
26410 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
26420 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
26430 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
26440 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
26450 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
26460 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
26470 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
26480 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
26490 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
264a0 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
264b0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
264c0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f  Parse;.  if( OK_
264d0 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70  IF_ALWAYS_TRUE(p
264e0 50 61 72 73 65 2d 3e 70 57 69 74 68 29 20 26 26  Parse->pWith) &&
264f0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
26500 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
26510 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
26520 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
26530 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
26540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
26550 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
26560 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
26570 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
26580 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
26590 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
265a0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
265b0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
265c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
265d0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
265e0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
265f0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
26600 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
26610 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
26620 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
26630 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
26640 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
26650 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
26660 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
26670 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
26680 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
26690 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
266a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
266b0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
266c0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
266d0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
266e0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
266f0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
26700 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
26710 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
26720 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
26730 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
26740 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
26750 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
26760 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
26770 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
26780 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
26790 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
267a0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
267b0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
267c0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
267d0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
267e0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
267f0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
26800 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
26810 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
26820 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
26830 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
26840 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
26850 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
26860 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
26870 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
26880 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
26890 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
268a0 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
268b0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
268c0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
268d0 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
268e0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
268f0 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
26900 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
26910 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
26920 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
26930 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
26940 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
26950 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
26960 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
26970 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
26980 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
26990 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
269a0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
269b0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
269c0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
269d0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
269e0 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
269f0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
26a00 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
26a10 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
26a20 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
26a30 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
26a40 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
26a50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
26a60 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
26a70 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
26a80 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
26a90 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
26aa0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
26ab0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
26ac0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
26ad0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
26ae0 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
26af0 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
26b00 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
26b10 61 67 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74  ags;.  u32 elist
26b20 46 6c 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d  Flags = 0;..  p-
26b30 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
26b40 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20  Expanded;.  if( 
26b50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26b60 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
26b70 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
26b80 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
26b90 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65  !=0 );.  if( (se
26ba0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
26bb0 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
26bc0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
26bd0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
26be0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
26bf0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
26c00 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  ;.  sqlite3WithP
26c10 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ush(pParse, p->p
26c20 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  With, 0);..  /* 
26c30 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
26c40 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
26c50 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
26c60 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
26c70 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
26c80 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
26c90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
26ca0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
26cb0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
26cc0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
26cd0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
26ce0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
26cf0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
26d00 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
26d10 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
26d20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
26d30 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
26d40 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
26d50 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
26d60 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
26d70 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
26d80 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
26d90 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
26da0 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
26db0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
26dc0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
26dd0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
26de0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
26df0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
26e00 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26e10 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
26e20 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54  ==0 || pFrom->pT
26e30 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
26e40 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63   pFrom->fg.isRec
26e50 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75  ursive ) continu
26e60 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
26e70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
26e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26e90 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28  OMIT_CTE.    if(
26ea0 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c   withExpand(pWal
26eb0 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  ker, pFrom) ) re
26ec0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26ed0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
26ee0 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65  Tab ) {} else.#e
26ef0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
26f00 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  om->zName==0 ){.
26f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26f20 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
26f30 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
26f40 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
26f50 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
26f60 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
26f70 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
26f80 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
26f90 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
26fa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26fb0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
26fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
26fd0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
26fe0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72  alker, pSel) ) r
26ff0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
27000 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
27010 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
27020 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
27030 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
27040 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
27050 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
27060 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
27070 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
27080 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  1;.      if( pFr
27090 6f 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  om->zAlias ){.  
270a0 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
270b0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
270c0 44 75 70 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a  Dup(db, pFrom->z
270d0 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 65  Alias);.      }e
270e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
270f0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
27100 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
27110 75 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76 6f  ubquery_%p", (vo
27120 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
27130 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
27140 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
27150 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
27160 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
27170 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
27180 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
27190 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
271a0 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
271b0 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
271c0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
271d0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
271e0 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
271f0 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
27200 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
27210 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
27220 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
27230 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
27240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27250 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
27260 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
27270 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
27280 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
27290 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
272a0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
272b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
272c0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
272d0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
272e0 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
272f0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
27300 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
27310 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
27320 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78  Tab->nTabRef>=0x
27330 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
27340 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27350 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
27360 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
27370 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
27380 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
27390 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
273a0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
273b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
273c0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
273d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
273e0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
273f0 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
27400 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
27410 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
27420 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
27430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
27440 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
27450 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
27460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
27470 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
27480 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
27490 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
274a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
274b0 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
274c0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
274d0 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
274e0 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
274f0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
27500 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
27510 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
27520 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27530 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
27540 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
27550 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
27560 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
27570 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
27580 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
27590 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
275a0 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
275b0 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
275c0 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
275d0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
275e0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
275f0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
27600 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
27610 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
27620 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
27630 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
27640 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
27650 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
27660 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
27670 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
27680 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
27690 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
276a0 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
276b0 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
276c0 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
276d0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
276e0 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
276f0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
27700 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
27710 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
27720 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
27730 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
27740 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
27750 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
27760 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
27770 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
27780 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
27790 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
277a0 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
277b0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
277c0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
277d0 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
277e0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
277f0 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
27800 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
27810 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
27820 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
27830 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
27840 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
27850 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
27860 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
27870 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
27880 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
27890 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
278a0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
278b0 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
278c0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
278d0 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
278e0 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
278f0 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
27900 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
27910 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
27920 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
27930 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
27940 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
27950 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
27960 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
27970 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
27980 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
27990 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
279a0 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
279b0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
279c0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
279d0 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
279e0 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
279f0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
27a00 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
27a10 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
27a20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27a30 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
27a40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27a50 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27a60 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
27a70 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
27a80 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
27a90 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
27aa0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
27ab0 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
27ac0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c   ) break;.    el
27ad0 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
27ae0 66 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28  flags;.  }.  if(
27af0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27b00 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
27b10 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
27b20 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
27b30 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
27b40 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
27b50 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
27b60 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
27b70 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
27b80 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
27b90 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
27ba0 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
27bb0 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
27bc0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
27bd0 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
27be0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
27bf0 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
27c00 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
27c10 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
27c20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
27c30 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
27c40 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
27c50 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
27c60 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
27c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c80 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
27c90 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
27ca0 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
27cb0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
27cc0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
27cd0 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
27ce0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6c  .pExpr;.      el
27cf0 69 73 74 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e  istFlags |= pE->
27d00 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 70 52 69  flags;.      pRi
27d10 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74  ght = pE->pRight
27d20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27d30 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
27d40 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  | pRight!=0 );. 
27d50 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21       if( pE->op!
27d60 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20  =TK_ASTERISK.   
27d70 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d      && (pE->op!=
27d80 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
27d90 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
27da0 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  K).      ){.    
27db0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
27dc0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
27dd0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
27de0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
27df0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27e00 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
27e10 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
27e20 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
27e30 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
27e40 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
27e50 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
27e60 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
27e70 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
27e80 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
27e90 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
27ea0 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
27eb0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
27ec0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
27ed0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
27ee0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
27ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27f00 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
27f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27f20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
27f30 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
27f40 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
27f50 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
27f60 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
27f70 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
27f80 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
27f90 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
27fa0 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
27fb0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
27fc0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
27fd0 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74  0;       /* text
27fe0 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
27ff0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
28000 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
28010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
28020 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d  ert( pE->pLeft!=
28030 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
28040 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28050 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66  roperty(pE->pLef
28060 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  t, EP_IntValue) 
28070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  );.          zTN
28080 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d  ame = pE->pLeft-
28090 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
280a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
280b0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
280c0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
280d0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
280e0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pFrom++){.      
280f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
28100 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
28110 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
28120 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSub = pFrom->p
28130 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
28140 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
28150 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73   = pFrom->zAlias
28160 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
28170 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e  t char *zSchemaN
28180 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
28190 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
281a0 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
281b0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
281c0 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20       zTabName = 
281d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
281e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
281f0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
28200 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
28210 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
28220 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d  Sub==0 || (pSub-
28230 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
28240 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b  estedFrom)==0 ){
28250 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75  .            pSu
28260 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  b = 0;.         
28270 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
28280 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28290 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
282a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
282b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
282c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
282d0 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20            iDb = 
282e0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
282f0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
28300 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
28310 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
28320 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e   = iDb>=0 ? db->
28330 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
28340 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
28350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
28360 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
28370 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
28380 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
28390 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
283a0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
283b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
283c0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
283d0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
283e0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
283f0 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
28400 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
28410 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
28420 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
28430 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
28440 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
28450 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
28460 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
28470 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
28480 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
28490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
284a0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
284b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
284c0 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
284d0 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
284e0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
284f0 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
28500 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28520 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28530 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
28540 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
28550 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
28560 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74  hidden', omit it
28570 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64   from the expand
28580 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ed.            *
28590 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73  * result-set lis
285a0 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c  t unless the SEL
285b0 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49  ECT has the SF_I
285c0 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20  ncludeHidden.   
285d0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20           ** bit 
285e0 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  set..           
285f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28600 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
28610 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64   & SF_IncludeHid
28620 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  den)==0.        
28630 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e       && IsHidden
28640 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
28650 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20  ol[j]) .        
28660 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
28670 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
28680 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28690 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
286a0 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
286b0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
286c0 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
286d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
286e0 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pFrom->fg.jointy
286f0 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
28700 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
28710 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
28720 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
28730 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
28740 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
28750 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28760 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
28770 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
28780 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
28790 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
287a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
287b0 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
287c0 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
287d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
287e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
287f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28800 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
28810 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
28820 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
28830 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
28840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28850 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
28860 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
28870 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
28880 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28890 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
288a0 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
288b0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
288c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
288d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
288e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
288f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28900 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
28910 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28920 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
28930 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
28940 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
28950 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
28960 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
28970 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
28980 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
28990 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
289a0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
289b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
289c0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
289d0 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
289e0 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
289f0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
28a00 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
28a10 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
28a20 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  t, pRight);.    
28a30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
28a40 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
28a60 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
28a70 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
28a80 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
28a90 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
28aa0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
28ab0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
28ac0 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  Left, pExpr);.  
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28af0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
28b10 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
28b20 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
28b30 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
28b40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28b50 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
28b60 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
28b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28b90 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28ba0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
28bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28bc0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
28bd0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
28be0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
28bf0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
28c00 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
28c10 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20  Init(&sColname, 
28c20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
28c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28c40 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
28c50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
28c60 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
28c70 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
28c80 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
28c90 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
28ca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
28cb0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
28cc0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20  List_item *pX = 
28cd0 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e  &pNew->a[pNew->n
28ce0 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20  Expr-1];.       
28cf0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20         if( pSub 
28d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28d10 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73     pX->zSpan = s
28d20 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
28d30 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  b, pSub->pEList-
28d40 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[j].zSpan);.  
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
28d60 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
28d70 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
28d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28da0 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
28db0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
28dc0 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %s.%s",.        
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20     zSchemaName, 
28e00 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  zTabName, zColna
28e10 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28e20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
28e30 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28e60 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b  >bSpanIsTab = 1;
28e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28e80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28e90 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
28ea0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
28eb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28ec0 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
28ed0 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
28ee0 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
28ef0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28f00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
28f10 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
28f20 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
28f30 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
28f40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
28f50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28f60 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
28f70 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
28f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28f90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28fa0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
28fb0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
28fc0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
28fd0 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
28fe0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69   }.  if( p->pELi
28ff0 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  st ){.    if( p-
29000 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
29010 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
29020 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
29030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
29040 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
29050 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
29060 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
29070 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29080 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
29090 0a 20 20 20 20 69 66 28 20 28 65 6c 69 73 74 46  .    if( (elistF
290a0 6c 61 67 73 20 26 20 28 45 50 5f 48 61 73 46 75  lags & (EP_HasFu
290b0 6e 63 7c 45 50 5f 53 75 62 71 75 65 72 79 29 29  nc|EP_Subquery))
290c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  !=0 ){.      p->
290d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
290e0 6f 6d 70 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20  omplexResult;.  
290f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29100 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
29110 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
29120 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
29130 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
29140 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
29150 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
29160 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
29170 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
29180 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
29190 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
291a0 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
291b0 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
291c0 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
291d0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
291e0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
291f0 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
29200 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
29210 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
29220 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
29230 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
29240 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
29250 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
29260 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
29270 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
29280 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
29290 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
292a0 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
292b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
292c0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
292d0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
292e0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
292f0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
29300 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
29310 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 20  rse-tree walker 
29320 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
29330 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65  ments..** subque
29340 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
29350 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
29360 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
29370 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
29380 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
29390 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
293a0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
293b0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
293c0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
293d0 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51  tinue;.}..#if SQ
293e0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
293f0 20 41 6c 77 61 79 73 20 61 73 73 65 72 74 2e 20   Always assert. 
29400 20 54 68 69 73 20 78 53 65 6c 65 63 74 43 61 6c   This xSelectCal
29410 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74  lback2 implement
29420 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74 68 61  ation proves tha
29430 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74  t the.** xSelect
29440 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e 65 76  Callback2 is nev
29450 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76  er invoked..*/.v
29460 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
29470 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57 61 6c  tWalkAssert2(Wal
29480 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
29490 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
294a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
294b0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
294c0 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73 65 72  tUsed2);.  asser
294d0 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  t( 0 );.}.#endif
294e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
294f0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
29500 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29510 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
29520 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
29530 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
29540 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
29550 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
29560 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
29570 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
29580 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
29590 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
295a0 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
295b0 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
295c0 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
295d0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
295e0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
295f0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
29600 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29610 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
29620 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
29630 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
29640 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
29650 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
29660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
29670 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
29680 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
29690 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
296a0 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
296b0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
296c0 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
296d0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
296e0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
296f0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
29700 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
29710 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
29720 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
29730 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
29740 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
29750 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
29760 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78 70 72  ker w;.  w.xExpr
29770 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
29780 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
29790 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
297a0 72 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46  rse;.  if( OK_IF
297b0 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61  _ALWAYS_TRUE(pPa
297c0 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
297d0 29 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ) ){.    w.xSele
297e0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e  ctCallback = con
297f0 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
29800 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20  ctToSubquery;.  
29810 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
29820 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71  ack2 = 0;.    sq
29830 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
29840 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
29850 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
29860 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
29870 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c  pander;.  w.xSel
29880 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
29890 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20  electPopWith;.  
298a0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
298b0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
298c0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
298d0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
298e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
298f0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
29900 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
29910 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
29920 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
29930 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
29940 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
29950 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
29960 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
29970 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
29980 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
29990 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
299a0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
299b0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
299c0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
299d0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
299e0 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
299f0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
29a00 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
29a10 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
29a20 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
29a30 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
29a40 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
29a50 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
29a60 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
29a70 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
29a80 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
29a90 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
29aa0 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
29ab0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
29ac0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
29ad0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
29ae0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
29af0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
29b00 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
29b10 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
29b20 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
29b30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
29b40 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
29b50 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
29b60 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
29b70 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
29b80 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
29b90 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
29ba0 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed );.  assert( 
29bb0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
29bc0 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
29bd0 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  0 );.  p->selFla
29be0 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
29bf0 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d  Info;.  pParse =
29c00 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
29c10 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
29c20 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->pSrc;.  for(i=
29c30 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
29c40 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
29c50 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
29c60 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
29c70 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
29c80 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
29c90 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
29ca0 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46   if( (pTab->tabF
29cb0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
29cc0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
29cd0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
29ce0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29cf0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
29d00 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
29d10 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
29d20 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28  elect;.      if(
29d30 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
29d40 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
29d50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
29d60 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
29d70 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
29d80 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
29d90 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
29da0 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
29db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29dc0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
29dd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29de0 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
29df0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
29e00 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
29e10 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
29e20 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
29e30 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
29e40 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
29e50 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
29e60 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
29e70 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
29e80 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
29e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29ea0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
29eb0 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
29ec0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
29ed0 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
29ee0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29ef0 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
29f00 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
29f10 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
29f20 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b  3SelectWalkNoop;
29f30 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
29f40 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
29f50 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
29f60 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
29f70 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
29f80 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
29f90 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
29fa0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
29fb0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
29fc0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
29fd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29fe0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
29ff0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
2a000 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
2a010 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
2a020 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
2a030 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
2a040 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
2a050 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
2a060 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
2a070 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
2a080 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
2a090 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
2a0a0 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
2a0b0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
2a0c0 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
2a0d0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
2a0e0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
2a0f0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
2a100 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
2a110 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
2a120 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
2a130 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
2a140 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
2a150 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
2a160 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
2a170 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
2a180 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
2a190 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
2a1a0 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
2a1b0 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
2a1c0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
2a1d0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2a1e0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
2a1f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2a200 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2a210 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2a220 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2a230 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2a240 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2a250 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
2a260 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
2a270 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
2a280 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
2a290 72 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  r */.){.  assert
2a2a0 28 20 70 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p!=0 || pParse
2a2b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2a2c0 65 64 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ed );.  if( pPar
2a2d0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2a2e0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2a2f0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2a300 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2a310 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  o ) return;.  sq
2a320 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2a330 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  d(pParse, p);.  
2a340 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2a350 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
2a360 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
2a370 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
2a380 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
2a390 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
2a3a0 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
2a3b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70  Parse->nErr || p
2a3c0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
2a3d0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
2a3e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2a3f0 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61  tAddTypeInfo(pPa
2a400 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rse, p);.}../*.*
2a410 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
2a420 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2a430 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
2a440 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2a450 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
2a460 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
2a470 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
2a480 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
2a490 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
2a4a0 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
2a4b0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
2a4c0 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68  enerates code th
2a4d0 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20  at stores NULLs 
2a4e0 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20  in all of those 
2a4f0 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e  memory.** cells.
2a500 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a510 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2a520 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a530 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2a540 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2a550 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2a560 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2a570 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2a580 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67  Func;.  int nReg
2a590 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   = pAggInfo->nFu
2a5a0 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  nc + pAggInfo->n
2a5b0 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52  Column;.  if( nR
2a5c0 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  eg==0 ) return;.
2a5d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2a5e0 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
2a5f0 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f  that all AggInfo
2a600 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77   registers are w
2a610 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20  ithin the range 
2a620 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a  specified by.  *
2a630 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e  * AggInfo.mnReg.
2a640 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a  .AggInfo.mxReg *
2a650 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67  /.  assert( nReg
2a660 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  ==pAggInfo->mxRe
2a670 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  g-pAggInfo->mnRe
2a680 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  g+1 );.  for(i=0
2a690 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  ; i<pAggInfo->nC
2a6a0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2a6b0 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2a6c0 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e  o->aCol[i].iMem>
2a6d0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2a6e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2a6f0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2a700 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
2a710 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  xReg );.  }.  fo
2a720 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
2a730 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  o->nFunc; i++){.
2a740 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
2a750 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
2a760 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2a770 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2a780 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
2a790 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
2a7a0 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
2a7b0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
2a7c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2a7d0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
2a7e0 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67  nfo->mnReg, pAgg
2a7f0 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20  Info->mxReg);.  
2a800 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
2a810 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
2a820 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2a830 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
2a840 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d  {.    if( pFunc-
2a850 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2a860 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
2a870 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a  = pFunc->pExpr;.
2a880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
2a890 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2a8a0 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  E, EP_xIsSelect)
2a8b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
2a8c0 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
2a8d0 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pE->x.pList->nEx
2a8e0 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  pr!=1 ){.       
2a8f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2a900 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2a910 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75  CT aggregates mu
2a920 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20  st have exactly 
2a930 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  one ".          
2a940 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20   "argument");.  
2a950 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
2a960 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
2a970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a980 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
2a990 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
2a9a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2a9b0 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  , pE->x.pList, 0
2a9c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2a9d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a9e0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2a9f0 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
2aa00 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
2aa30 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2aa40 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
2aa50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2aa60 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
2aa70 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
2aa80 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
2aa90 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
2aaa0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
2aab0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2aac0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
2aad0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
2aae0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2aaf0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2ab00 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2ab10 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2ab20 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
2ab30 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2ab40 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
2ab50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
2ab60 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
2ab70 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
2ab80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
2ab90 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
2aba0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
2abb0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2abc0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
2abd0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2abe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2abf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67  eAddOp2(v, OP_Ag
2ac00 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
2ac10 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
2ac20 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
2ac30 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
2ac40 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e  ndP4(v, pF->pFun
2ac50 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2ac60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
2ac70 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
2ac80 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
2ac90 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
2aca0 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
2acb0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
2acc0 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
2acd0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
2ace0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
2acf0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2ad00 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2ad10 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2ad20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2ad30 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
2ad40 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
2ad50 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
2ad60 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2ad70 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
2ad80 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
2ad90 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
2ada0 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
2adb0 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2adc0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2add0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2ade0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2adf0 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
2ae00 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
2ae10 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
2ae20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2ae30 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
2ae40 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
2ae50 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2ae60 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
2ae70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
2ae80 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
2ae90 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d   ){.      nArg =
2aea0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
2aeb0 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71       regAgg = sq
2aec0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
2aed0 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b  e(pParse, nArg);
2aee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2aef0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2af00 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65  Parse, pList, re
2af10 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gAgg, 0, SQLITE_
2af20 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d  ECEL_DUP);.    }
2af30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
2af40 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
2af50 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
2af60 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
2af70 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
2af80 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
2af90 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2afa0 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
2afb0 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20  se( nArg==0 );  
2afc0 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69  /* Error conditi
2afd0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  on */.      test
2afe0 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20  case( nArg>1 ); 
2aff0 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72    /* Also an err
2b000 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65  or */.      code
2b010 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
2b020 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20   pF->iDistinct, 
2b030 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67  addrNext, 1, reg
2b040 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Agg);.    }.    
2b050 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66  if( pF->pFunc->f
2b060 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
2b070 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
2b080 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
2b090 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
2b0a0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2b0b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2b0c0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
2b0d0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2b0e0 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
2b0f0 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
2b100 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
2b110 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
2b120 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
2b130 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
2b140 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
2b150 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2b160 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2b170 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
2b180 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
2b190 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
2b1a0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
2b1b0 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
2b1c0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
2b1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2b1e0 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
2b1f0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
2b200 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
2b210 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2b220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b230 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
2b240 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
2b250 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
2b260 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
2b270 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b280 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2b290 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72  P_AggStep0, 0, r
2b2a0 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29  egAgg, pF->iMem)
2b2b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2b2c0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
2b2d0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
2b2e0 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
2b2f0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2b300 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
2b310 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
2b320 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
2b330 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2b340 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2b350 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2b360 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
2b370 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
2b380 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
2b390 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2b3a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2b3b0 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
2b3c0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2b3d0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2b3e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
2b3f0 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
2b400 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
2b410 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
2b420 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
2b430 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
2b440 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
2b450 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
2b460 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
2b470 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
2b480 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
2b490 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
2b4a0 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
2b4b0 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
2b4c0 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
2b4d0 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
2b4e0 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
2b4f0 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
2b500 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
2b510 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
2b520 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
2b530 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
2b540 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
2b550 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
2b560 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
2b570 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
2b580 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
2b590 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
2b5a0 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
2b5b0 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
2b5c0 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
2b5d0 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
2b5e0 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
2b5f0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
2b600 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
2b610 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
2b620 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b630 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56  P_If, regHit); V
2b640 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2b650 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
2b660 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2b670 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  se);.  for(i=0, 
2b680 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  pC=pAggInfo->aCo
2b690 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  l; i<pAggInfo->n
2b6a0 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b  Accumulator; i++
2b6b0 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  , pC++){.    sql
2b6c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
2b6d0 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20  rse, pC->pExpr, 
2b6e0 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20  pC->iMem);.  }. 
2b6f0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2b700 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c  tMode = 0;.  sql
2b710 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2b720 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  ar(pParse);.  if
2b730 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b  ( addrHitTest ){
2b740 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b750 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
2b760 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a  HitTest);.  }.}.
2b770 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e  ./*.** Add a sin
2b780 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  gle OP_Explain i
2b790 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
2b7a0 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69  e VDBE to explai
2b7b0 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f  n a simple.** co
2b7c0 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53  unt(*) query ("S
2b7d0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2b7e0 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23  ROM pTab")..*/.#
2b7f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b800 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69  IT_EXPLAIN.stati
2b810 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69  c void explainSi
2b820 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72  mpleCount(.  Par
2b830 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b850 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
2b860 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b880 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
2b890 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49  g queried */.  I
2b8a0 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b8c0 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20  * Index used to 
2b8d0 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f  optimize scan, o
2b8e0 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  r NULL */.){.  i
2b8f0 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
2b900 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74  in==2 ){.    int
2b910 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21   bCover = (pIdx!
2b920 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28  =0 && (HasRowid(
2b930 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d  pTab) || !IsPrim
2b940 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
2b950 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  )));.    char *z
2b960 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
2b970 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
2b980 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
2b990 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
2b9a0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
2b9b0 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53     bCover ? " US
2b9c0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
2b9d0 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
2b9e0 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78     bCover ? pIdx
2b9f0 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20  ->zName : "".   
2ba00 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2ba10 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
2ba20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65     pParse->pVdbe
2ba30 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
2ba40 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
2ba50 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f   0, 0, zEqp, P4_
2ba60 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20  DYNAMIC.    );. 
2ba70 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
2ba80 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  ine explainSimpl
2ba90 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65  eCount(a,b,c).#e
2baa0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ndif../*.** sqli
2bab0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
2bac0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68  llback used by h
2bad0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a  avingToWhere()..
2bae0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  **.** If the nod
2baf0 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
2bb00 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b  callback is a TK
2bb10 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72  _AND node, retur
2bb20 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e  n .** WRC_Contin
2bb30 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74  ue to tell sqlit
2bb40 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20  e3WalkExpr() to 
2bb50 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2bb60 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a  child nodes..**.
2bb70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2bb80 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20  turn WRC_Prune. 
2bb90 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
2bba0 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  so check if the 
2bbb0 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69  .** sub-expressi
2bbc0 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  on matches the c
2bbd0 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e  riteria for bein
2bbe0 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57  g moved to the W
2bbf0 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  HERE.** clause. 
2bc00 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f  If so, add it to
2bc10 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2bc20 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
2bc30 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  e sub-expression
2bc40 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48  .** within the H
2bc50 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2bc60 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
2bc70 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "1"..*/.static 
2bc80 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72  int havingToWher
2bc90 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
2bca0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2bcb0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2bcc0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29  pr->op!=TK_AND )
2bcd0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  {.    Select *pS
2bce0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
2bcf0 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 73  elect;.    if( s
2bd00 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
2bd10 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57  tantOrGroupBy(pW
2bd20 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
2bd30 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f 75 70  Expr, pS->pGroup
2bd40 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  By) ){.      sql
2bd50 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b  ite3 *db = pWalk
2bd60 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  er->pParse->db;.
2bd70 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
2bd80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
2bd90 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
2bda0 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
2bdb0 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20  okens[1], 0);.  
2bdc0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
2bdd0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 57          Expr *pW
2bde0 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68 65 72  here = pS->pWher
2bdf0 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  e;.        SWAP(
2be00 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45  Expr, *pNew, *pE
2be10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
2be20 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2be30 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
2be40 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  pNew);.        p
2be50 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e 65 77  S->pWhere = pNew
2be60 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ;.        pWalke
2be70 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
2be80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2be90 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2bea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
2beb0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
2bec0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
2bed0 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72  ligible terms fr
2bee0 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c  om the HAVING cl
2bef0 61 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c  ause of a query,
2bf00 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f   which is.** pro
2bf10 63 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f  cessed after gro
2bf20 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48  uping, to the WH
2bf30 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ERE clause, whic
2bf40 68 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62  h is processed b
2bf50 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e  efore.** groupin
2bf60 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  g. For example, 
2bf70 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  the query:.**.**
2bf80 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2bf90 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20   <tables> WHERE 
2bfa0 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  a=? GROUP BY b H
2bfb0 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d  AVING b=? AND c=
2bfc0 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ?.**.** can be r
2bfd0 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a  ewritten as:.**.
2bfe0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2bff0 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2c000 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52  E a=? AND b=? GR
2c010 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20  OUP BY b HAVING 
2c020 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d  c=?.**.** A term
2c030 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65   of the HAVING e
2c040 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69  xpression is eli
2c050 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66  gible for transf
2c060 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74  er if it consist
2c070 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66  s.** entirely of
2c080 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65   constants and e
2c090 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2c0a0 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42  are also GROUP B
2c0b0 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20  Y terms that.** 
2c0c0 75 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22  use the "BINARY"
2c0d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
2c0e0 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
2c0f0 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72  oid havingToWher
2c100 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
2c110 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 57   Select *p){.  W
2c120 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
2c130 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72   memset(&sWalker
2c140 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c  , 0, sizeof(sWal
2c150 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72  ker));.  sWalker
2c160 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2c170 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70  ;.  sWalker.xExp
2c180 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69  rCallback = havi
2c190 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b  ngToWhereExprCb;
2c1a0 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65  .  sWalker.u.pSe
2c1b0 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  lect = p;.  sqli
2c1c0 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61  te3WalkExpr(&sWa
2c1d0 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69 6e 67  lker, p->pHaving
2c1e0 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2c1f0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2c200 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 26   sWalker.eCode &
2c210 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74  & (sqlite3Select
2c220 54 72 61 63 65 20 26 20 30 78 31 30 30 29 21 3d  Trace & 0x100)!=
2c230 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2c240 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73  RACE(0x100,pPars
2c250 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56 49 4e  e,p,("Move HAVIN
2c260 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57 48 45  G terms into WHE
2c270 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  RE:\n"));.    sq
2c280 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2c290 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2c2a0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
2c2b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2c2c0 66 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72  f the pThis entr
2c2d0 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73  y of pTabList is
2c2e0 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20   a self-join of 
2c2f0 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a  a prior view..**
2c300 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2c310 72 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69  return the SrcLi
2c320 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20  st_item for the 
2c330 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20  prior view.  If 
2c340 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68  it is not,.** th
2c350 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  en return 0..*/.
2c360 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72  static struct Sr
2c370 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65  cList_item *isSe
2c380 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72  lfJoinView(.  Sr
2c390 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2c3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2c3b0 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f  arch for self-jo
2c3c0 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d  ins in this FROM
2c3d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2c3e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2c3f0 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61   *pThis   /* Sea
2c400 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65  rch for prior re
2c410 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2c420 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
2c430 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2c440 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2c450 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  or(pItem = pTabL
2c460 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54  ist->a; pItem<pT
2c470 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  his; pItem++){. 
2c480 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2c490 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
2c4a0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2c4b0 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2c4c0 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ine ) continue;.
2c4d0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2c4e0 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2c4f0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2c500 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2c510 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54  m->zDatabase, pT
2c520 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21  his->zDatabase)!
2c530 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c540 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2c550 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  tricmp(pItem->zN
2c560 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d  ame, pThis->zNam
2c570 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2c580 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2c590 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2c5a0 0a 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73  .          pThis
2c5b0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2c5c0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2c5d0 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a  t->pWhere, -1) .
2c5e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2c5f0 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
2c600 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
2c610 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
2c620 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
2c630 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
2c640 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
2c650 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2c660 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
2c670 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2c680 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2c690 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2c6a0 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
2c6b0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
2c6c0 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
2c6d0 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
2c6e0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2c6f0 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
2c700 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
2c710 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
2c720 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
2c730 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
2c740 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
2c750 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2c760 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
2c770 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
2c780 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
2c790 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
2c7a0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2c7b0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2c7c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
2c7d0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
2c7e0 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
2c7f0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
2c800 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
2c810 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
2c820 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
2c830 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
2c840 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
2c850 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
2c860 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
2c870 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
2c880 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
2c890 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
2c8a0 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
2c8b0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
2c8c0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
2c8d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2c8e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
2c8f0 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
2c900 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
2c910 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
2c920 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2c930 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
2c940 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c950 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
2c960 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
2c970 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2c980 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
2c990 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
2c9a0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c9b0 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72       /* Single r
2c9c0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  esult column */.
2c9d0 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c    pExpr = p->pEL
2c9e0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
2c9f0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2ca00 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
2ca10 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  N ) return 0;   
2ca20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69       /* Result i
2ca30 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a  s an aggregate *
2ca40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
2ca50 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75  stricmp(pExpr->u
2ca60 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29  .zToken,"count")
2ca70 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
2ca80 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f 0a 20   Is count() */. 
2ca90 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c   if( pExpr->x.pL
2caa0 69 73 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ist!=0 ) return 
2cab0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2cac0 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
2cad0 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66 28 20  unt(*) */.  if( 
2cae0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
2caf0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cb10 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20 46 52   One table in FR
2cb20 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  OM  */.  pSub = 
2cb30 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2cb40 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70 53 75  elect;.  if( pSu
2cb50 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  b==0 ) return 0;
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2cb80 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75 62 71  e FROM is a subq
2cb90 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 53  uery */.  if( pS
2cba0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20  ub->pPrior==0 ) 
2cbb0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2cbd0 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  ust be a compoun
2cbe0 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  d ry */.  do{.  
2cbf0 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70 21 3d    if( pSub->op!=
2cc00 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62 2d 3e  TK_ALL && pSub->
2cc10 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20  pPrior ) return 
2cc20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 55  0;  /* Must be U
2cc30 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20 20 20  NION ALL */.    
2cc40 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
2cc50 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc70 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20 63 6c    /* No WHERE cl
2cc80 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  ause */.    if( 
2cc90 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2cca0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 20   SF_Aggregate ) 
2ccb0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a  return 0;     /*
2ccc0 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   Not an aggregat
2ccd0 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20  e */.    pSub = 
2cce0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 20 20  pSub->pPrior;   
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cd10 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70 6f 75  peat over compou
2cd20 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20  nd */.  }while( 
2cd30 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  pSub );..  /* If
2cd40 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
2cd50 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69 73 20  oint then it is 
2cd60 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
2cd70 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2cd80 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
2cd90 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
2cda0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
2cdb0 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
2cdc0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2cdd0 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
2cde0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
2cdf0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
2ce00 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2ce10 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
2ce20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
2ce30 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2ce40 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
2ce50 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
2ce60 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
2ce70 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
2ce80 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
2ce90 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
2cea0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
2ceb0 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
2cec0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2ced0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2cee0 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
2cef0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
2cf00 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
2cf10 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
2cf20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2cf30 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2cf40 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
2cf50 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
2cf60 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
2cf70 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
2cf80 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
2cf90 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
2cfa0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2cfb0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
2cfc0 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
2cfd0 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
2cfe0 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
2cff0 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
2d000 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
2d010 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
2d020 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
2d030 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
2d040 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
2d050 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
2d060 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2d070 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2d080 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
2d090 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
2d0a0 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
2d0b0 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
2d0c0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
2d0d0 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
2d0e0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
2d0f0 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
2d100 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2d110 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2d120 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2d130 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2d140 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2d150 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
2d160 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
2d170 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
2d180 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2d190 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2d1a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2d1b0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2d1c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
2d1d0 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2d1e0 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
2d1f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2d200 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2d210 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
2d220 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
2d230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2d240 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
2d250 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2d260 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
2d270 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
2d280 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
2d290 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
2d2a0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
2d2b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d2c0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2d2d0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
2d2e0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
2d2f0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
2d300 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
2d310 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
2d320 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
2d330 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
2d340 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
2d350 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
2d360 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
2d370 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2d380 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
2d390 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
2d3a0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
2d3b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2d3c0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2d3d0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2d3e0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2d3f0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2d400 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2d410 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2d420 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2d430 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
2d440 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
2d450 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
2d460 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
2d470 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
2d480 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2d490 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2d4a0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2d4b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2d4c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
2d4d0 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
2d4e0 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
2d4f0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
2d500 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2d510 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
2d520 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
2d530 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
2d540 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d550 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
2d560 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
2d570 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2d580 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
2d590 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
2d5a0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
2d5b0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2d5c0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
2d5d0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
2d5e0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
2d5f0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
2d600 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2d610 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
2d620 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2d630 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
2d640 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
2d650 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
2d660 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2d670 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
2d680 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
2d690 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
2d6a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
2d6b0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
2d6c0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
2d6d0 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
2d6e0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
2d6f0 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
2d700 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
2d710 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2d720 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
2d730 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
2d740 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
2d750 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2d760 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
2d770 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
2d780 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
2d790 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
2d7a0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
2d7b0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
2d7c0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
2d7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2d7e0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
2d7f0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
2d800 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2d810 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2d820 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d830 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
2d840 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   *pMinMaxOrderBy
2d850 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65 64 20   = 0;  /* Added 
2d860 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d 69 6e  ORDER BY for min
2d870 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
2d880 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61 67 3b    u8 minMaxFlag;
2d890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8a0 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d 69 6e   /* Flag for min
2d8b0 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a 2f 0a  /max queries */.
2d8c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d8d0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
2d8e0 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
2d8f0 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
2d900 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
2d910 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
2d920 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2d930 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
2d940 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2d950 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
2d960 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2d970 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
2d980 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
2d990 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
2d9a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2d9b0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
2d9c0 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
2d9d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
2d9e0 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
2d9f0 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
2da00 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  ));.#if SELECTTR
2da10 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
2da20 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
2da30 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72  se,p, ("begin pr
2da40 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a  ocessing:\n"));.
2da50 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2da60 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2da70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
2da80 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
2da90 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
2daa0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
2dab0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2dac0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2dad0 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
2dae0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2daf0 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2db00 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
2db10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2db20 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2db30 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2db40 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
2db50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2db60 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2db70 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
2db80 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
2db90 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
2dba0 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
2dbb0 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
2dbc0 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
2dbd0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2dbe0 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
2dbf0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2dc00 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
2dc10 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2dc20 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
2dc30 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
2dc40 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
2dc50 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
2dc60 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
2dc70 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
2dc80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2dc90 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
2dca0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
2dcb0 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
2dcc0 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
2dcd0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
2dce0 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
2dcf0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
2dd00 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
2dd10 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
2dd20 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
2dd30 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2dd40 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
2dd50 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
2dd60 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
2dd70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2dd80 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
2dd90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
2dda0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
2ddb0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
2ddc0 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
2ddd0 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
2dde0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2ddf0 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
2de00 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
2de10 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2de20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2de30 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2de40 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
2de50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
2de60 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67  ist!=0 );.  isAg
2de70 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
2de80 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2de90 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  !=0;.#if SELECTT
2dea0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2deb0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2dec0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2ded0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2dee0 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2def0 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
2df00 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
2df10 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2df20 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2df30 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2df40 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
2df50 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64 65  er the VDBE unde
2df60 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20  r construction, 
2df70 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
2df80 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a   VDBE if one.  *
2df90 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  * does not alrea
2dfa0 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20  dy exist */.  v 
2dfb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2dfc0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2dfd0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
2dfe0 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 44  ct_end;.  if( pD
2dff0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2e000 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
2e010 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
2e020 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
2e030 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76  }..  /* Try to v
2e040 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
2e050 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67  ions (flattening
2e060 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64   subqueries, and
2e070 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72   strength.  ** r
2e080 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e  eduction of join
2e090 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74   operators) in t
2e0a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
2e0b0 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
2e0c0 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
2e0d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2e0e0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2e0f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e100 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2e110 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
2e120 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
2e130 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2e140 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2e150 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2e160 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2e170 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2e180 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2e190 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
2e1a0 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
2e1b0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
2e1c0 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20   LEFT JOIN into 
2e1d0 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72  JOIN if there ar
2e1e0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72  e terms of the r
2e1f0 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a  ight table.    *
2e200 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  * of the LEFT JO
2e210 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57  IN used in the W
2e220 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20  HERE clause..   
2e230 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2e240 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2e250 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20  & JT_LEFT)!=0.  
2e260 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
2e270 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52  rImpliesNonNullR
2e280 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  ow(p->pWhere, pI
2e290 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20  tem->iCursor).  
2e2a0 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2e2b0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2e2c0 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69  LITE_SimplifyJoi
2e2d0 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
2e2e0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2e2f0 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20  0,pParse,p,.    
2e300 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45              ("LE
2e310 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69  FT-JOIN simplifi
2e320 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65  es to JOIN on te
2e330 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20  rm %d\n",i));.  
2e340 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f      pItem->fg.jo
2e350 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c  intype &= ~(JT_L
2e360 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20  EFT|JT_OUTER);. 
2e370 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
2e380 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49  pr(p->pWhere, pI
2e390 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
2e3a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
2e3b0 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66  futher action if
2e3c0 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68   this term of th
2e3d0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
2e3e0 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a   no a subquery *
2e3f0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  /.    if( pSub==
2e400 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2e410 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
2e420 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
2e430 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
2e440 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
2e450 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
2e460 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
2e470 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
2e480 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2e490 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
2e4a0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2e4b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2e4c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
2e4d0 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
2e4e0 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
2e4f0 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
2e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2e510 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
2e520 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
2e530 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
2e540 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2e550 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  nd;.    }..    /
2e560 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  * Do not try to 
2e570 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65  flatten an aggre
2e580 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20  gate subquery.. 
2e590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61     **.    ** Fla
2e5a0 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65  ttening an aggre
2e5b0 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73  gate subquery is
2e5c0 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2e5d0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
2e5e0 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  y.    ** is not 
2e5f0 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20  a join.  But if 
2e600 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2e610 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74  is not a join, t
2e620 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hen the subquery
2e630 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
2e640 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2e650 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20   co-routine and 
2e660 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
2e670 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20  ntage to.    ** 
2e680 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68  flattening in th
2e690 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
2e6a0 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73      if( (pSub->s
2e6b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
2e6c0 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e  regate)!=0 ) con
2e6d0 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2e6e0 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  t( pSub->pGroupB
2e6f0 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  y==0 );..    /* 
2e700 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  If the outer que
2e710 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  ry contains a "c
2e720 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73  omplex" result s
2e730 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20  et (that is,.   
2e740 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c   ** if the resul
2e750 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74  t set of the out
2e760 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75  er query uses fu
2e770 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75  nctions or subqu
2e780 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e  eries).    ** an
2e790 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  d if the subquer
2e7a0 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52  y contains an OR
2e7b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2e7c0 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
2e7d0 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
2e7e0 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2e7f0 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
2e800 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
2e810 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
2e820 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
2e830 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
2e840 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2e850 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
2e860 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
2e870 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
2e880 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
2e890 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
2e8a0 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
2e8b0 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
2e8c0 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
2e8d0 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
2e8e0 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
2e8f0 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
2e900 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
2e910 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
2e920 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
2e930 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75  .    ** The requ
2e940 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  irement that the
2e950 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76   outer query hav
2e960 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75  e a complex resu
2e970 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65  lt set.    ** me
2e980 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ans that flatten
2e990 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f  ing does occur o
2e9a0 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f  n simpler SQL co
2e9b0 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75  nstraints withou
2e9c0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70  t.    ** the exp
2e9d0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2e9e0 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20  ) like:.    **. 
2e9f0 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20     **  SELECT x 
2ea00 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
2ea10 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59  ROM tab ORDER BY
2ea20 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20   y LIMIT 10);.  
2ea30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
2ea40 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20  b->pOrderBy!=0. 
2ea50 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20      && i==0.    
2ea60 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
2ea70 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73   & SF_ComplexRes
2ea80 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ult)!=0.     && 
2ea90 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
2eaa0 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  =1.         || (
2eab0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
2eac0 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
2ead0 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2eae0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
2eaf0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2eb00 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
2eb10 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2eb20 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b   p, i, isAgg) ){
2eb30 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
2eb40 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
2eb50 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
2eb60 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
2eb70 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
2eb80 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2eb90 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2eba0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ebb0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2ebc0 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
2ebd0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2ebe0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2ebf0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2ec00 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2ec10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
2ec20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ec30 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2ec40 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
2ec50 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2ec60 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
2ec70 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
2ec80 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
2ec90 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
2eca0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2ecb0 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2ecc0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2ecd0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2ece0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2ecf0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2ed00 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2ed10 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2ed20 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2ed30 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2ed40 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2ed50 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2ed60 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2ed70 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2ed80 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2ed90 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
2eda0 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2edb0 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20   clause, do two 
2edc0 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29  things:.  ** (1)
2edd0 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65   Authorized unre
2ede0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a  ferenced tables.
2edf0 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74    ** (2) Generat
2ee00 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
2ee10 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a  ub-queries.  */.
2ee20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2ee30 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2ee40 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2ee50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2ee60 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2ee70 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
2ee80 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
2ee90 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20  lect *pSub;.#if 
2eea0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2eeb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
2eec0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
2eed0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
2eee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
2eef0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  vedAuthContext;.
2ef00 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
2ef10 73 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44  ssue SQLITE_READ
2ef20 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20   authorizations 
2ef30 77 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75  with a fake colu
2ef40 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a  mn name for any.
2ef50 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68      ** tables th
2ef60 61 74 20 61 72 65 20 72 65 66 65 72 65 6e 63 65  at are reference
2ef70 64 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68  d but from which
2ef80 20 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65   no values are e
2ef90 78 74 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a  xtracted..    **
2efa0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65   Examples of whe
2efb0 72 65 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f  re these kinds o
2efc0 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45  f null SQLITE_RE
2efd0 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  AD authorization
2efe0 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f  s.    ** would o
2eff0 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ccur:.    **.   
2f000 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63   **     SELECT c
2f010 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
2f020 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
2f030 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20  D t1."".    **  
2f040 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46     SELECT t1.* F
2f050 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d  ROM t1, t2;   --
2f060 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e   SQLITE_READ t2.
2f070 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  "".    **.    **
2f080 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   The fake column
2f090 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74   name is an empt
2f0a0 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73  y string.  It is
2f0b0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
2f0c0 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20  table to.    ** 
2f0d0 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  have a column na
2f0e0 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79  med by the empty
2f0f0 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63   string, in whic
2f100 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  h case there is 
2f110 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a  no way to.    **
2f120 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74   distinguish bet
2f130 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65  ween an unrefere
2f140 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61  nced table and a
2f150 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e  n actual referen
2f160 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ce to the.    **
2f170 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20   "" column. The 
2f180 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
2f190 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65  was for the fake
2f1a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20   column name to 
2f1b0 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a  be a NULL,.    *
2f1c0 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65  * which would be
2f1d0 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42   unambiguous.  B
2f1e0 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72  ut legacy author
2f1f0 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
2f200 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61  s might.    ** a
2f210 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e  ssume the column
2f220 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c   name is non-NUL
2f230 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20  L and segfault. 
2f240 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65   The use of an e
2f250 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69  mpty.    ** stri
2f260 6e 67 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  ng for the fake 
2f270 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d  column name seem
2f280 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a  s safer..    */.
2f290 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63      if( pItem->c
2f2a0 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20  olUsed==0 ){.   
2f2b0 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68     sqlite3AuthCh
2f2c0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2f2d0 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e  TE_READ, pItem->
2f2e0 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d  zName, "", pItem
2f2f0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
2f300 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
2f310 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2f320 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2f330 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2f340 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e  VIEW).    /* Gen
2f350 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
2f360 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
2f370 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2f380 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75  e.    */.    pSu
2f390 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2f3a0 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  ct;.    if( pSub
2f3b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2f3c0 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
2f3d0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
2f3e0 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
2f3f0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
2f400 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
2f410 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
2f420 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
2f430 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
2f440 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
2f450 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
2f460 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
2f470 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
2f480 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2f490 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
2f4a0 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
2f4b0 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
2f4c0 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
2f4d0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
2f4e0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
2f4f0 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
2f500 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
2f510 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
2f520 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
2f530 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
2f540 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
2f550 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
2f560 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
2f570 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
2f580 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b  aCoroutine==0 ){
2f590 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2f5a0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2f5b0 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69  manifests the vi
2f5c0 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e  ew might be a on
2f5d0 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a  e-time routine,.
2f5e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74          ** or it
2f5f0 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
2f600 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20  e rerun on each 
2f610 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73  iteration becaus
2f620 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  e it.        ** 
2f630 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c  encodes a correl
2f640 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a  ated subquery. *
2f650 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  /.        testca
2f660 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47  se( sqlite3VdbeG
2f670 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61  etOp(v, pItem->a
2f680 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63  ddrFillSub)->opc
2f690 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a  ode==OP_Once );.
2f6a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2f6b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2f6c0 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
2f6d0 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
2f6e0 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
2f6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
2f700 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2f710 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
2f720 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
2f730 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
2f740 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
2f750 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
2f760 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
2f770 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
2f780 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
2f790 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
2f7a0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
2f7b0 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
2f7c0 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
2f7d0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
2f7e0 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
2f7f0 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
2f800 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
2f810 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
2f820 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
2f830 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
2f840 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
2f850 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
2f860 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
2f870 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2f880 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
2f890 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2f8a0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
2f8b0 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
2f8c0 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
2f8d0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
2f8e0 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
2f8f0 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
2f900 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
2f910 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
2f920 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
2f930 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
2f940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f      */.    if( O
2f950 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2f960 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75  ed(db, SQLITE_Pu
2f970 73 68 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20  shDown).     && 
2f980 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2f990 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
2f9a0 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2f9b0 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20  m->iCursor,.    
2f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9d0 20 20 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66         (pItem->f
2f9e0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2f9f0 4f 55 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29  OUTER)!=0).    )
2fa00 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
2fa10 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
2fa20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2fa30 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2fa40 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
2fa50 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2fa60 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
2fa70 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
2fa80 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
2fa90 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2faa0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2fab0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2fac0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2fad0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2fae0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
2faf0 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f  Push-down not po
2fb00 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20  ssible\n"));.   
2fb10 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75   }..    zSavedAu
2fb20 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
2fb30 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
2fb40 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41  ;.    pParse->zA
2fb50 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
2fb60 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  em->zName;..    
2fb70 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2fb80 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2fb90 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a  e subquery.    *
2fba0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62  *.    ** The sub
2fbb0 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65  query is impleme
2fbc0 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75  nted as a co-rou
2fbd0 74 69 6e 65 20 69 66 20 74 68 65 20 73 75 62 71  tine if the subq
2fbe0 75 65 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67  uery is.    ** g
2fbf0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2fc00 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28  the outer loop (
2fc10 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
2fc20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
2fc30 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d     ** computed m
2fc40 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20  ore than once). 
2fc50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     **.    ** TOD
2fc60 4f 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68  O: Are there oth
2fc70 65 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64  er reasons besid
2fc80 65 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63  e (1) to use a c
2fc90 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  o-routine.    **
2fca0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f   implementation?
2fcb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fcc0 69 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  i==0.     && (pT
2fcd0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
2fce0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
2fcf0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66  pTabList->a[1].f
2fd00 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c  g.jointype&(JT_L
2fd10 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
2fd20 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20  0)  /* (1) */.  
2fd30 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2fd40 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2fd50 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2fd60 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2fd70 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2fd80 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2fd90 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2fda0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2fdb0 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2fdc0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2fdd0 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2fde0 20 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72   .      pItem->r
2fdf0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2fe00 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2fe10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fe20 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2fe30 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2fe40 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2fe50 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2fe60 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2fe70 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2fe80 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2fe90 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2fea0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2feb0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2fec0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2fed0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2fee0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2fef0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2ff00 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2ff10 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2ff20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2ff30 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2ff40 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2ff50 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2ff60 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2ff70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2ff80 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2ff90 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ow;.      pItem-
2ffa0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2ffb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65   = 1;.      pIte
2ffc0 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64  m->regResult = d
2ffd0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20  est.iSdst;.     
2ffe0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2fff0 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65  oroutine(v, pIte
30000 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
30010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30020 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
30030 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  Top-1);.      sq
30040 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
30050 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a  gCache(pParse);.
30060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30070 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
30080 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
30090 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65  ill fill an ephe
300a0 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68  meral table with
300b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
300c0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75  ntent of this su
300d0 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e  bquery.  pItem->
300e0 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c  addrFillSub will
300f0 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20   point.      ** 
30100 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  to the address o
30110 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
30120 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74  subroutine.  pIt
30130 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20  em->regReturn.  
30140 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69      ** is a regi
30150 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74  ster allocated t
30160 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f  o hold the subro
30170 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64  utine return add
30180 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ress.      */.  
30190 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b      int topAddr;
301a0 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41  .      int onceA
301b0 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ddr = 0;.      i
301c0 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20  nt retAddr;.    
301d0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
301e0 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a  _item *pPrior;..
301f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
30200 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
30210 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==0 );.      pIt
30220 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
30230 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
30240 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20        topAddr = 
30250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30260 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
30270 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65   0, pItem->regRe
30280 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74  turn);.      pIt
30290 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
302a0 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20  = topAddr+1;.   
302b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
302c0 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
302d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
302e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
302f0 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
30300 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
30310 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
30320 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
30330 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
30340 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
30350 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
30360 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
30370 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
30380 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
30390 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
303a0 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
303b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
303c0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
303d0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
303e0 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
303f0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
30400 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e));.      }else
30410 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f  {.        VdbeNo
30420 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
30430 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
30440 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
30450 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
30460 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  }.      pPrior =
30470 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28   isSelfJoinView(
30480 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29  pTabList, pItem)
30490 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
304a0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  or ){.        sq
304b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
304c0 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
304d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70  Item->iCursor, p
304e0 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b  Prior->iCursor);
304f0 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
30500 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
30510 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50 72  ->iSelectId, pPr
30520 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b  ior->iSelectId);
30530 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30540 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
30550 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
30560 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  Sub->nSelectRow 
30570 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  = pPrior->pSelec
30580 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  t->nSelectRow;. 
30590 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
305a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
305b0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
305c0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70   SRT_EphemTab, p
305d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
305e0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
305f0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
30600 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
30610 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
30620 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20  ectId);.        
30630 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
30640 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
30650 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
30660 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
30670 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
30680 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
30690 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
306a0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
306b0 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
306c0 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
306d0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
306e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
306f0 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
30700 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
30710 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
30720 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
30730 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
30740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
30750 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
30760 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
30770 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
30780 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
30790 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
307a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
307b0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
307c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
307d0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
307e0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
307f0 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70  Height(p);.    p
30800 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
30810 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
30820 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a  Context;.#endif.
30830 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75    }..  /* Variou
30840 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  s elements of th
30850 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20  e SELECT copied 
30860 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61  into local varia
30870 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f  bles for.  ** co
30880 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70  nvenience */.  p
30890 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
308a0 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  t;.  pWhere = p-
308b0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
308c0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
308d0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
308e0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
308f0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
30900 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
30910 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
30920 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
30930 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
30940 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30950 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
30960 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
30970 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
30980 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  ter all FROM-cla
30990 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  use analysis:\n"
309a0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
309b0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
309c0 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
309d0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
309e0 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50  E_COUNTOFVIEW_OP
309f0 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
30a00 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
30a10 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
30a20 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53  QueryFlattener|S
30a30 51 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65  QLITE_CountOfVie
30a40 77 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66  w).   && countOf
30a50 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  ViewOptimization
30a60 28 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b  (pParse, p).  ){
30a70 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
30a80 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
30a90 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
30aa0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
30ab0 69 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  ist;.    pTabLis
30ac0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d  t = p->pSrc;.  }
30ad0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
30ae0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
30af0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
30b00 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
30b10 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
30b20 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
30b30 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
30b40 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
30b50 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
30b60 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
30b70 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
30b80 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
30b90 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
30ba0 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
30bb0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
30bc0 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
30bd0 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
30be0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
30bf0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
30c00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
30c10 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
30c20 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
30c30 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
30c40 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
30c50 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
30c60 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
30c70 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
30c80 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
30c90 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
30ca0 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
30cb0 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
30cc0 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
30cd0 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
30ce0 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
30cf0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
30d00 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
30d10 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
30d20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
30d30 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
30d40 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
30d50 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
30d60 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
30d70 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
30d80 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
30d90 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
30da0 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
30db0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
30dc0 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
30dd0 2e 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73  .pOrderBy, pELis
30de0 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
30df0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
30e00 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
30e10 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
30e20 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
30e30 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
30e40 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
30e50 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
30e60 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
30e70 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
30e80 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
30e90 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
30ea0 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
30eb0 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
30ec0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
30ed0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
30ee0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
30ef0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
30f00 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
30f10 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
30f20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
30f30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
30f40 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30f50 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  );..#if SELECTTR
30f60 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
30f70 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
30f80 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
30f90 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
30fa0 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
30fb0 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44  ,p,("Transform D
30fc0 49 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f  ISTINCT into GRO
30fd0 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20  UP BY:\n"));.   
30fe0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30ff0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
31000 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
31010 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
31020 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
31030 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63  Y clause, then c
31040 72 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  reate an ephemer
31050 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a  al index to.  **
31060 20 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e   do the sorting.
31070 20 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69    But this sorti
31080 6e 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  ng ephemeral ind
31090 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a  ex might end up.
310a0 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65    ** being unuse
310b0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
310c0 6e 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69  n be extracted i
310d0 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
310e0 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74  er..  ** If that
310f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
31100 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  en the OP_OpenEp
31110 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
31120 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  ion will be.  **
31130 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
31140 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66  P_Noop once we f
31150 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
31160 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
31170 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65   is.  ** not nee
31180 64 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e  ded.  The sSort.
31190 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61  addrSortIndex va
311a0 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
311b0 6f 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a  o facilitate.  *
311c0 2a 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  * that change.. 
311d0 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e   */.  if( sSort.
311e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
311f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
31200 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
31210 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
31220 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53  rList(pParse, sS
31230 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c  ort.pOrderBy, 0,
31240 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
31250 0a 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72  .    sSort.iECur
31260 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
31270 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e  ab++;.    sSort.
31280 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a  addrSortIndex =.
31290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
312a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
312b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
312c0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43         sSort.iEC
312d0 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72  ursor, sSort.pOr
312e0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70  derBy->nExpr+1+p
312f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c  EList->nExpr, 0,
31300 0a 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72  .          (char
31310 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
31320 45 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a  EYINFO.      );.
31330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f    }else{.    sSo
31340 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
31350 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
31360 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
31370 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
31380 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
31390 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
313a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
313b0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
313c0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
313d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
313e0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
313f0 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53  meral, pDest->iS
31400 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  DParm, pEList->n
31410 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
31420 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
31430 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
31440 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
31450 61 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28  abel(v);.  if( (
31460 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
31470 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20  _FixedLimit)==0 
31480 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  ){.    p->nSelec
31490 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20  tRow = 320;  /* 
314a0 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a  4 billion rows *
314b0 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c  /.  }.  computeL
314c0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
314d0 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
314e0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d    if( p->iLimit=
314f0 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72  =0 && sSort.addr
31500 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a  SortIndex>=0 ){.
31510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
31520 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73  hangeOpcode(v, s
31530 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
31540 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  ex, OP_SorterOpe
31550 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  n);.    sSort.so
31560 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
31570 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
31580 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e   }..  /* Open an
31590 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
315a0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
315b0 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
315c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
315d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
315e0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
315f0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
31600 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
31610 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
31620 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
31630 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
31640 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
31670 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
31680 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316a0 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46   (char*)keyInfoF
316b0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
316c0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c  se, p->pEList,0,
316d0 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316f0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
31700 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
31710 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
31720 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
31730 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
31740 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
31750 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
31760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
31770 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
31780 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
31790 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
317a0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
317b0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
317c0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
317d0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
317e0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
317f0 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
31800 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
31810 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
31820 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
31830 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
31840 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  ( WHERE_USE_LIMI
31850 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  T==SF_FixedLimit
31860 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61   );.    wctrlFla
31870 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  gs |= p->selFlag
31880 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
31890 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  t;..    /* Begin
318a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
318b0 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c 45 43  an. */.    SELEC
318c0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
318d0 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e  p,("WhereBegin\n
318e0 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  "));.    pWInfo 
318f0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
31900 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
31910 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
31920 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
31950 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
31960 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
31970 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
31980 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
31990 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
319a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
319b0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
319c0 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
319d0 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
319e0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
319f0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
31a00 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
31a10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
31a20 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
31a30 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
31a40 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
31a50 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
31a60 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
31a70 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
31a80 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
31a90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
31aa0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
31ab0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
31ac0 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
31ad0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
31ae0 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
31af0 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
31b00 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
31b10 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
31b20 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
31b30 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
31b40 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
31b50 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
31b60 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
31b70 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
31b80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
31b90 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
31ba0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
31bb0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
31bc0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
31bd0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
31be0 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
31bf0 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
31c00 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
31c10 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
31c20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
31c30 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
31c40 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
31c50 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
31c60 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
31c70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
31c80 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
31c90 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
31ca0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
31cb0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
31cc0 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
31cd0 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  op. */.    asser
31ce0 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45  t( p->pEList==pE
31cf0 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c 65  List );.    sele
31d00 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
31d10 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72  se, p, -1, &sSor
31d20 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
31d30 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
31d40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31d50 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
31d60 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
31d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d80 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
31d90 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
31da0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
31db0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
31dc0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
31dd0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31de0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
31df0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
31e00 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31e10 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31e20 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31e30 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
31e40 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
31e50 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
31e60 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
31e70 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
31e80 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
31e90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
31ea0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
31eb0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31ec0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
31ed0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
31ee0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
31ef0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
31f00 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31f10 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31f20 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
31f30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
31f40 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
31f50 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
31f60 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
31f70 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
31f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f90 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
31fa0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
31fb0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
31fc0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fe0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
31ff0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
32000 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
32010 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
32020 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
32030 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
32040 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
32050 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
32060 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
32070 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
32080 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
32090 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
320a0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
320b0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
320c0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
320d0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
320e0 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
320f0 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
32100 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
32110 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
32120 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
32130 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
32140 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
32150 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
32160 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
32170 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
32180 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
32190 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
321a0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
321b0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
321c0 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
321d0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
321e0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
321f0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
32200 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
32210 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
32220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32230 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
32240 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
32250 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
32260 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
32270 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
32280 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
32290 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
322a0 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
322b0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
322c0 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
322d0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
322e0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
322f0 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
32300 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
32310 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
32320 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
32330 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
32340 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
32350 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
32360 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
32370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
32380 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
32390 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
323a0 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
323b0 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
323c0 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
323d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
323e0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
323f0 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
32400 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
32410 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
32420 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
32430 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
32440 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
32450 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
32460 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
32470 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
32480 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
32490 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
324a0 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
324b0 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
324c0 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
324d0 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
324e0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
324f0 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
32500 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
32510 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
32520 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
32530 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
32540 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
32550 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
32560 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
32570 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
32580 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
32590 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
325a0 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
325b0 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
325c0 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
325d0 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
325e0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
325f0 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
32600 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
32610 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
32620 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
32630 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
32640 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
32650 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
32660 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
32670 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
32680 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
32690 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
326a0 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
326b0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
326c0 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
326d0 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
326e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
326f0 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
32700 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
32710 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
32720 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
32730 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
32740 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
32750 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
32760 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
32770 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
32780 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
32790 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
327a0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
327b0 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
327c0 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
327d0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
327e0 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
327f0 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
32800 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20  NC.uNC.pAggInfo 
32810 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
32820 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e   VVA_ONLY( sNC.n
32830 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41 67 67  cFlags = NC_UAgg
32840 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41 67 67  Info; ).    sAgg
32850 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
32860 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
32870 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
32880 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
32890 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
328a0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
328b0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
328c0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
328d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
328e0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
328f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
32900 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
32910 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
32920 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
32930 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
32940 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f  {.      if( pGro
32950 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
32960 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d 3d  assert( pWhere==
32970 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20 20  p->pWhere );.   
32980 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 61       assert( pHa
32990 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67  ving==p->pHaving
329a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
329b0 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d  rt( pGroupBy==p-
329c0 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20  >pGroupBy );.   
329d0 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68 65       havingToWhe
329e0 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  re(pParse, p);. 
329f0 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
32a00 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
32a10 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
32a20 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
32a30 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
32a40 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
32a50 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
32a60 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
32a70 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  .nColumn;.    if
32a80 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
32a90 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d   && p->pHaving==
32aa0 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46  0 && sAggInfo.nF
32ab0 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unc==1 ){.      
32ac0 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e  minMaxFlag = min
32ad0 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73 41 67  MaxQuery(db, sAg
32ae0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70  gInfo.aFunc[0].p
32af0 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72  Expr, &pMinMaxOr
32b00 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73  derBy);.    }els
32b10 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  e{.      minMaxF
32b20 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  lag = WHERE_ORDE
32b30 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  RBY_NORMAL;.    
32b40 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
32b50 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
32b60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
32b70 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
32b80 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
32b90 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
32ba0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
32bb0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
32bc0 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
32bd0 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
32be0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
32bf0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
32c00 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
32c10 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
32c20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
32c30 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
32c40 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
32c50 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
32c60 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
32c70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
32c80 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
32c90 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  end;.#if SELECTT
32ca0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
32cb0 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
32cc0 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
32cd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
32ce0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
32cf0 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
32d00 70 2c 28 22 41 66 74 65 72 20 61 67 67 72 65 67  p,("After aggreg
32d10 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22  ate analysis:\n"
32d20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
32d30 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
32d40 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
32d50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32d60 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
32d70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
32d80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
32d90 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d  ("agg-column[%d]
32da0 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20   iMem=%d\n",.   
32db0 20 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67           ii, sAg
32dc0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69  gInfo.aCol[ii].i
32dd0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
32de0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
32df0 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43  r(0, sAggInfo.aC
32e00 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29  ol[ii].pExpr, 0)
32e10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32e20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 41 67  for(ii=0; ii<sAg
32e30 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b  gInfo.nFunc; ii+
32e40 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
32e50 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
32e60 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d  agg-func[%d]: iM
32e70 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
32e80 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
32e90 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65  fo.aFunc[ii].iMe
32ea0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
32eb0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
32ec0 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  0, sAggInfo.aFun
32ed0 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b  c[ii].pExpr, 0);
32ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
32ef0 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50  endif...    /* P
32f00 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
32f10 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47 52  gregates with GR
32f20 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20 64  OUP BY is very d
32f30 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20  ifferent and.   
32f40 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f   ** much more co
32f50 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65  mplex than aggre
32f60 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61 20  gates without a 
32f70 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f  GROUP BY..    */
32f80 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
32f90 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e  y ){.      KeyIn
32fa0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f  fo *pKeyInfo;  /
32fb0 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61  * Keying informa
32fc0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f  tion for the gro
32fd0 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a  up by clause */.
32fe0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b        int addr1;
32ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76            /* A-v
33000 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20  s-B comparision 
33010 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  jump */.      in
33020 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b  t addrOutputRow;
33030 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75    /* Start of su
33040 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
33050 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20 72  tputs a result r
33060 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ow */.      int 
33070 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20  regOutputRow;   
33080 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
33090 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f  s register for o
330a0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
330b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
330c0 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a  drSetAbort;   /*
330d0 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20 66   Set the abort f
330e0 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a  lag and return *
330f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
33100 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54  TopOfLoop;  /* T
33110 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  op of the input 
33120 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e  loop */.      in
33130 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  t addrSortingIdx
33140 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e  ; /* The OP_Open
33150 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68  Ephemeral for th
33160 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
33170 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
33180 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
33190 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72  Subroutine for r
331a0 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63  esetting the acc
331b0 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20  umulator */.    
331c0 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20    int regReset; 
331d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
331e0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
331f0 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f   for reset subro
33200 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20  utine */..      
33210 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
33220 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
33230 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61   we might need a
33240 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
33250 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65  o.      ** imple
33260 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61  ment it.  Alloca
33270 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20  te that sorting 
33280 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69  index now.  If i
33290 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20  t turns out.    
332a0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
332b0 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74 65  not need it afte
332c0 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f  r all, the OP_So
332d0 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63  rterOpen instruc
332e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69  tion.      ** wi
332f0 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
33300 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20  into a Noop.  . 
33310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41       */.      sA
33320 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
33330 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
33340 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e  ++;.      pKeyIn
33350 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
33360 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
33370 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41   pGroupBy, 0, sA
33380 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
33390 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
333a0 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
333b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
333c0 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
333d0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
333e0 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
333f0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
33400 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
33410 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
33420 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
33430 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
33440 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
33450 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
33460 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
33470 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
33480 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
33490 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
334a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
334b0 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
334c0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
334d0 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
334e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
334f0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
33500 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
33510 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
33520 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
33530 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
33540 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
33550 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
33560 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
33570 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
33580 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
33590 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
335a0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
335b0 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
335c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
335d0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
335e0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
335f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
33600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
33610 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
33620 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
33630 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33640 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
33650 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
33660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33670 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
33680 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
33690 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
336a0 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
336b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
336c0 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
336d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
336e0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
336f0 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
33700 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
33710 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
33720 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
33730 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
33740 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
33750 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
33760 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
33770 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
33780 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
33790 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
337a0 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
337b0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
337c0 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
337d0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
337e0 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
337f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
33800 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
33810 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
33820 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
33830 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33840 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
33850 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
33860 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t);.      SELECT
33870 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
33880 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
33890 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
338a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
338b0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
338c0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
338d0 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
338e0 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
338f0 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
33900 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
33910 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
33920 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
33930 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
33940 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
33950 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
33960 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
33970 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
33980 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
33990 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
339a0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
339b0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
339c0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
339d0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
339e0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
339f0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
33a00 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
33a10 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
33a20 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
33a30 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
33a40 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
33a50 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
33a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
33a70 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
33a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33a90 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
33aa0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
33ab0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
33ac0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
33ad0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
33ae0 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
33af0 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
33b00 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
33b10 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
33b20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
33b30 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
33b40 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
33b50 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
33b60 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
33b70 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
33b80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
33b90 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
33ba0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
33bb0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
33bc0 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
33bd0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
33be0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
33bf0 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
33c00 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
33c10 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
33c20 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
33c30 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
33c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c50 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
33c60 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
33c70 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
33c80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
33c90 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
33ca0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
33cb0 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
33cc0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
33cd0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
33ce0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
33cf0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
33d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
33d10 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
33d20 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
33d30 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
33d40 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
33d50 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
33d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
33d70 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
33d80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
33d90 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
33da0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
33db0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
33dc0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
33dd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
33de0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
33df0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
33e00 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
33e10 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
33e20 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
33e30 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
33e40 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
33e50 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
33e60 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
33e70 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
33e80 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
33e90 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
33ea0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
33eb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
33ec0 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
33ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
33ee0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
33ef0 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
33f00 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
33f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
33f30 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
33f40 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
33f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
33f60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
33f70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33f80 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
33f90 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
33fa0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
33fb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33fc0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
33fd0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
33fe0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
33ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
34000 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
34010 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
34020 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
34030 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
34040 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
34050 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
34060 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
34070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
34080 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
34090 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
340a0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
340b0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
340c0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
340d0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
340e0 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
340f0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
34100 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
34110 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
34120 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
34130 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34140 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
34150 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
34160 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
34170 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
34180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34190 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
341a0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
341b0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
341c0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
341d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
341e0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
341f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
34200 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
34210 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
34220 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
34230 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
34240 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
34250 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
34260 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
34270 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
34280 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
34290 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
342a0 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
342b0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
342c0 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
342d0 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
342e0 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
342f0 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
34300 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
34310 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
34320 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
34330 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
34340 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
34350 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
34360 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
34370 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
34380 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
34390 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
343a0 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
343b0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
343c0 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
343d0 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
343e0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
343f0 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
34400 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
34410 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
34420 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
34430 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
34440 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
34450 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
34460 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
34470 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
34480 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
34490 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
344a0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
344b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
344c0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
344d0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
344e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
344f0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
34500 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
34510 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
34520 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
34530 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
34540 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
34550 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
34560 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
34570 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
34580 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
34590 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
345a0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
345b0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
345c0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
345d0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
345e0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
345f0 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
34600 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
34610 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
34620 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
34630 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
34640 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
34650 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
34660 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
34670 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
34680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34690 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
346a0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
346b0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 0a 20  fo.sortingIdx,. 
346c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346d0 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74           sortOut
346e0 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  , sortPTab);.   
346f0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
34700 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
34710 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
34720 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
34730 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
34740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34750 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
34760 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
34770 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
34780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34790 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
347a0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
347b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
347c0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
347d0 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
347e0 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
347f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34810 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
34820 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
34830 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
34840 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
34850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
34860 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
34870 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
34880 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
34890 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
348a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
348b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
348c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
348d0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
348e0 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31 2b 31  r1+1, 0, addr1+1
348f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
34900 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  v);..      /* Ge
34910 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
34920 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
34930 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
34940 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
34950 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
34960 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
34970 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
34980 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
34990 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
349a0 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
349b0 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
349c0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
349d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
349e0 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
349f0 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
34a00 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
34a10 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
34a20 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
34a30 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
34a40 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
34a50 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
34a60 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
34a70 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
34a80 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
34a90 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
34aa0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
34ab0 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
34ac0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
34ad0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
34ae0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
34af0 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
34b00 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
34b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34b20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
34b30 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
34b40 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
34b50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34b60 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
34b70 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
34b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34b90 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
34ba0 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
34bb0 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
34bc0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
34bd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63  omment((v, "chec
34be0 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  k abort flag"));
34bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34c00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
34c10 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
34c20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
34c30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34c40 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c  , "reset accumul
34c50 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
34c60 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67  /* Update the ag
34c70 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
34c80 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68  tors based on th
34c90 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20  e content of.   
34ca0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
34cb0 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20  t row.      */. 
34cc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34cd0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
34ce0 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
34cf0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
34d00 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
34d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
34d30 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
34d40 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
34d50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
34d60 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
34d70 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
34d80 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
34d90 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
34da0 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
34db0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
34dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34dd0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
34de0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
34df0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
34e00 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
34e10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
34e20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
34e40 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
34e50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34e60 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
34e70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
34e80 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
34e90 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
34ea0 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
34eb0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
34ec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34ed0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
34ee0 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
34ef0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
34f00 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34f10 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
34f20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
34f30 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
34f40 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
34f50 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
34f60 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
34f70 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
34f80 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
34f90 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
34fa0 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
34fb0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
34fc0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
34fd0 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
34fe0 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
34ff0 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
35000 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
35010 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
35020 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
35030 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
35040 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
35050 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
35060 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
35070 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
35080 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
35090 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
350a0 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
350b0 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
350c0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
350d0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
350e0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
350f0 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
35100 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
35110 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35120 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
35130 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
35140 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
35150 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35160 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
35170 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
35180 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
35190 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
351a0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
351b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
351c0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
351d0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
351e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
351f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
35200 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
35210 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
35220 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
35230 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
35240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
35250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35260 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
35270 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
35280 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
35290 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
352a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
352b0 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
352c0 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
352d0 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
352e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
352f0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
35300 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
35310 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
35320 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
35330 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
35340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
35350 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
35360 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
35370 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
35380 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
35390 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
353a0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
353b0 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
353c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353d0 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
353e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
353f0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
35400 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
35410 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
35420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
35430 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
35440 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
35450 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
35460 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
35470 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
35480 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
35490 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
354a0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
354b0 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
354c0 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
354d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
354e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
354f0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
35500 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
35510 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
35520 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
35530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35540 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
35550 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b  turn, regReset);
35560 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20  .     .    } /* 
35570 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20  endif pGroupBy. 
35580 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74 65   Begin aggregate
35590 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75 74   queries without
355a0 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20   GROUP BY: */.  
355b0 20 20 65 6c 73 65 20 7b 0a 23 69 66 6e 64 65 66    else {.#ifndef
355c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
355d0 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
355e0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
355f0 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
35600 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
35610 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
35620 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
35630 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
35640 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
35650 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
35660 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
35670 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
35680 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
35690 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
356a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
356b0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
356c0 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
356d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
356e0 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
356f0 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
35700 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
35710 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
35720 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
35730 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
35740 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
35750 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
35760 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
35770 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
35780 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
35790 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
357a0 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
357b0 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
357c0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
357d0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
357e0 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
357f0 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
35800 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
35810 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
35820 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
35830 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
35840 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
35850 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
35860 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
35870 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
35880 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
35890 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
358a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
358b0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
358c0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
358d0 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
358e0 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
358f0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
35900 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
35910 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
35920 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
35930 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
35940 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
35950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35960 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
35970 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
35980 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
35990 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
359a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
359b0 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
359c0 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
359d0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
359e0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
359f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
35a00 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
35a10 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
35a20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
35a30 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
35a40 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
35a50 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
35a60 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
35a70 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
35a80 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
35a90 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
35aa0 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
35ab0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
35ac0 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
35ad0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
35ae0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
35af0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
35b00 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
35b10 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
35b20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
35b30 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
35b40 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
35b50 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
35b60 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
35b70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
35b80 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
35b90 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
35ba0 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
35bb0 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
35bc0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
35bd0 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
35be0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35bf0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
35c00 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
35c10 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
35c20 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
35c30 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
35c40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35c50 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
35c60 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
35c70 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
35c80 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
35c90 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
35ca0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
35cb0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
35cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
35cd0 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
35ce0 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
35cf0 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
35d00 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
35d10 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
35d20 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
35d30 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
35d40 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
35d50 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
35d60 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
35d70 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
35d80 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
35d90 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
35da0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35db0 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
35dc0 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
35dd0 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
35de0 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
35df0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
35e00 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
35e10 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
35e20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
35e30 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
35e40 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
35e50 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
35e60 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
35e70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
35e80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
35e90 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
35ea0 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
35eb0 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
35ec0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
35ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35ee0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
35ef0 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
35f00 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
35f10 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
35f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35f30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
35f40 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
35f50 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
35f60 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
35f70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
35f80 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
35f90 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
35fa0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
35fb0 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
35fc0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
35fd0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
35fe0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
35ff0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
36000 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
36010 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
36020 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
36030 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
36040 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
36050 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
36060 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
36070 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
36080 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
36090 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
360a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
360b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
360c0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
360d0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
360e0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
360f0 41 67 67 49 6e 66 6f 29 3b 0a 0a 20 20 20 20 20  AggInfo);..     
36100 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 71 75     /* If this qu
36110 65 72 79 20 69 73 20 61 20 63 61 6e 64 69 64 61  ery is a candida
36120 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d  te for the min/m
36130 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  ax optimization,
36140 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
36150 20 6d 69 6e 4d 61 78 46 6c 61 67 20 77 69 6c 6c   minMaxFlag will
36160 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 76 69   have been previ
36170 6f 75 73 6c 79 20 73 65 74 20 74 6f 20 65 69 74  ously set to eit
36180 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  her.        ** W
36190 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
361a0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
361b0 59 5f 4d 41 58 20 61 6e 64 20 70 4d 69 6e 4d 61  Y_MAX and pMinMa
361c0 78 4f 72 64 65 72 42 79 20 77 69 6c 6c 0a 20 20  xOrderBy will.  
361d0 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20 61        ** be an a
361e0 70 70 72 6f 70 72 69 61 74 65 20 4f 52 44 45 52  ppropriate ORDER
361f0 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 66   BY expression f
36200 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  or the optimizat
36210 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
36220 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36230 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
36240 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
36250 20 7c 7c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72   || pMinMaxOrder
36260 42 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By!=0 );.       
36270 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
36280 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 4d  OrderBy==0 || pM
36290 69 6e 4d 61 78 4f 72 64 65 72 42 79 2d 3e 6e 45  inMaxOrderBy->nE
362a0 78 70 72 3d 3d 31 20 29 3b 0a 0a 20 20 20 20 20  xpr==1 );..     
362b0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31     SELECTTRACE(1
362c0 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65 72  ,pParse,p,("Wher
362d0 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20  eBegin\n"));.   
362e0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
362f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
36300 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
36310 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61  , pWhere, pMinMa
36320 78 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  xOrderBy,.      
36330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36340 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
36350 6d 69 6e 4d 61 78 46 6c 61 67 2c 20 30 29 3b 0a  minMaxFlag, 0);.
36360 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
36370 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
36380 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
36390 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
363a0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
363b0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
363c0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
363d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
363e0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
363f0 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
36400 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36410 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
36420 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
36430 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
36440 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36450 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
36460 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
36470 20 20 20 20 28 6d 69 6e 4d 61 78 46 6c 61 67 3d      (minMaxFlag=
36480 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
36490 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
364a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
364b0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
364c0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
364d0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
364e0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
364f0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
36500 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
36510 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
36520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
36530 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
36540 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
36550 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
36560 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
36570 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
36580 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c  Parse, p, -1, 0,
36590 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
365a0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
365b0 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
365c0 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
365d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
365e0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
365f0 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
36600 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
36610 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
36620 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
36630 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
36640 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
36650 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
36660 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
36670 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
36680 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
36690 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
366a0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
366b0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
366c0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
366d0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
366e0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
366f0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
36700 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
36710 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
36720 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20  pTable(pParse,. 
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36740 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
36750 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
36760 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
36770 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
36780 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
36790 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
367a0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
367b0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
367c0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
367d0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
367e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
367f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
36800 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
36810 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  The SELECT has b
36820 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68  een coded. If th
36830 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ere is an error 
36840 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
36850 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74  ucture,.  ** set
36860 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
36870 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65   to 1. Otherwise
36880 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70   0. */.  rc = (p
36890 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a  Parse->nErr>0);.
368a0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
368b0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
368c0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
368d0 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
368e0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
368f0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
36900 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
36910 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
36920 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
36930 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
36940 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
36950 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
36960 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
36970 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  b, pMinMaxOrderB
36980 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  y);.  sqlite3DbF
36990 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
369a0 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
369b0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
369c0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66  Info.aFunc);.#if
369d0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
369e0 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
369f0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
36a00 65 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  end processing\n
36a10 22 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  "));.#endif.  re
36a20 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.