/ Hex Artifact Content
Login

Artifact 4e00e042994ae38e60576921f78e45311eead49e:


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 58 29  SELECTTRACE(K,X)
0270: 20 20 69 66 28 73 71 6c 69 74 65 33 53 65 6c 65    if(sqlite3Sele
0280: 63 74 54 72 61 63 65 26 28 4b 29 29 20 73 71 6c  ctTrace&(K)) sql
0290: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
02a0: 58 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  X.#else.# define
02b0: 20 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 58   SELECTTRACE(K,X
02c0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ).#endif.../*.**
02d0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
02e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62  the following ob
02f0: 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20  ject is used to 
0300: 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69  record informati
0310: 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20  on about.** how 
0320: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 44  to process the D
0330: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c  ISTINCT keyword,
0340: 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73   to simplify pas
0350: 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d  sing that inform
0360: 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  ation.** into th
0370: 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f  e selectInnerLoo
0380: 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  p() routine..*/.
0390: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
03a0: 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74 69  istinctCtx Disti
03b0: 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44  nctCtx;.struct D
03c0: 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75  istinctCtx {.  u
03d0: 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f  8 isTnct;      /
03e0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
03f0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
0400: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75  s present */.  u
0410: 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f  8 eTnctType;   /
0420: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
0430: 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70  RE_DISTINCT_* op
0440: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
0450: 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20   tabTnct;    /* 
0460: 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  Ephemeral table 
0470: 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43  used for DISTINC
0480: 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  T processing */.
0490: 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20    int addrTnct; 
04a0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
04b0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
04c0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54   opcode for tabT
04d0: 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nct */.};../*.**
04e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
04f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62  the following ob
0500: 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20  ject is used to 
0510: 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69  record informati
0520: 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  on about.** the 
0530: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0540: 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66  UP BY) clause of
0550: 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67 20   query is being 
0560: 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64 65  coded..*/.typede
0570: 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74 78  f struct SortCtx
0580: 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63 74   SortCtx;.struct
0590: 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78 70   SortCtx {.  Exp
05a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
05b0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
05c0: 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 20  BY (or GROUP BY 
05d0: 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  clause) */.  int
05e0: 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20 20   nOBSat;        
05f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0600: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
0610: 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64 69  atisfied by indi
0620: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 43  ces */.  int iEC
0630: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f  ursor;         /
0640: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
0650: 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20 2a  for the sorter *
0660: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
0670: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  n;        /* Reg
0680: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62 6c  ister holding bl
0690: 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75 72  ock-output retur
06a0: 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  n address */.  i
06b0: 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20 20  nt labelBkOut;  
06c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c 61       /* Start la
06d0: 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f 63  bel for the bloc
06e0: 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  k-output subrout
06f0: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
0700: 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 2f  rSortIndex;    /
0710: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
0720: 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 6f   OP_SorterOpen o
0730: 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
0740: 61 6c 20 2a 2f 0a 20 20 75 38 20 73 6f 72 74 46  al */.  u8 sortF
0750: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 2f 2a  lags;         /*
0760: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 53 4f   Zero or more SO
0770: 52 54 46 4c 41 47 5f 2a 20 62 69 74 73 20 2a 2f  RTFLAG_* bits */
0780: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 53 4f 52 54  .};.#define SORT
0790: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 20  FLAG_UseSorter  
07a0: 30 78 30 31 20 20 20 2f 2a 20 55 73 65 20 53 6f  0x01   /* Use So
07b0: 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 65 61 64  rterOpen instead
07c0: 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72 61   of OpenEphemera
07d0: 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  l */../*.** Dele
07e0: 74 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65  te all the conte
07f0: 6e 74 20 6f 66 20 61 20 53 65 6c 65 63 74 20 73  nt of a Select s
0800: 74 72 75 63 74 75 72 65 20 62 75 74 20 64 6f 20  tructure but do 
0810: 6e 6f 74 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a  not deallocate.*
0820: 2a 20 74 68 65 20 73 65 6c 65 63 74 20 73 74 72  * the select str
0830: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a  ucture itself..*
0840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
0850: 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69 74 65  earSelect(sqlite
0860: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0870: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
0880: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0890: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
08a0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
08b0: 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  e(db, p->pSrc);.
08c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
08d0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  ete(db, p->pWher
08e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
08f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
0900: 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
0910: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0920: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
0930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0940: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0950: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 73  ->pOrderBy);.  s
0960: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
0970: 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
0980: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0990: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
09a0: 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  imit);.  sqlite3
09b0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
09c0: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 73 71  ->pOffset);.  sq
09d0: 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
09e0: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 7d  db, p->pWith);.}
09f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0a00: 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74 20  ze a SelectDest 
0a10: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
0a20: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
0a30: 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74 44  DestInit(SelectD
0a40: 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74 20  est *pDest, int 
0a50: 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72 6d  eDest, int iParm
0a60: 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65 73  ){.  pDest->eDes
0a70: 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a 20  t = (u8)eDest;. 
0a80: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
0a90: 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73 74  = iParm;.  pDest
0aa0: 2d 3e 61 66 66 53 64 73 74 20 3d 20 30 3b 0a 20  ->affSdst = 0;. 
0ab0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
0ac0: 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  0;.  pDest->nSds
0ad0: 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 0;.}.../*.**
0ae0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
0af0: 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65  Select structure
0b00: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
0b10: 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a  inter to that.**
0b20: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53   structure..*/.S
0b30: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
0b40: 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72 73 65  lectNew(.  Parse
0b50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
0b60: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0b70: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0b80: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 2f  t *pEList,     /
0b90: 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  * which columns 
0ba0: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
0bb0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72  e result */.  Sr
0bc0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
0bd0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
0be0: 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63 68 20  clause -- which 
0bf0: 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a  tables to scan *
0c00: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
0c10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
0c20: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
0c30: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
0c40: 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68 65 20  oupBy,   /* the 
0c50: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0c60: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
0c70: 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ng,        /* th
0c80: 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
0c90: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0ca0: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 74 68  OrderBy,   /* th
0cb0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
0cc0: 65 20 2a 2f 0a 20 20 75 31 36 20 73 65 6c 46 6c  e */.  u16 selFl
0cd0: 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ags,         /* 
0ce0: 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 73 2c  Flag parameters,
0cf0: 20 73 75 63 68 20 61 73 20 53 46 5f 44 69 73 74   such as SF_Dist
0d00: 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  inct */.  Expr *
0d10: 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  pLimit,         
0d20: 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20  /* LIMIT value. 
0d30: 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20   NULL means not 
0d40: 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  used */.  Expr *
0d50: 70 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20  pOffset         
0d60: 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e  /* OFFSET value.
0d70: 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20    NULL means no 
0d80: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53  offset */.){.  S
0d90: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
0da0: 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20  elect standin;. 
0db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
0dc0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
0dd0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
0de0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
0df0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61  of(*pNew) );.  a
0e00: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
0e10: 63 46 61 69 6c 65 64 20 7c 7c 20 21 70 4f 66 66  cFailed || !pOff
0e20: 73 65 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29 3b  set || pLimit );
0e30: 20 2f 2a 20 4f 46 46 53 45 54 20 69 6d 70 6c 69   /* OFFSET impli
0e40: 65 73 20 4c 49 4d 49 54 20 2a 2f 0a 20 20 69 66  es LIMIT */.  if
0e50: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0e60: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
0e70: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
0e80: 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e   pNew = &standin
0e90: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
0ea0: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
0eb0: 65 77 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ew));.  }.  if( 
0ec0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0ed0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
0ee0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
0ef0: 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
0f00: 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41 4c 4c  e3Expr(db,TK_ALL
0f10: 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ,0));.  }.  pNew
0f20: 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  ->pEList = pELis
0f30: 74 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30  t;.  if( pSrc==0
0f40: 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   ) pSrc = sqlite
0f50: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0f60: 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  , sizeof(*pSrc))
0f70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
0f80: 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70   pSrc;.  pNew->p
0f90: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
0fa0: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0fb0: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70   = pGroupBy;.  p
0fc0: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  New->pHaving = p
0fd0: 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e  Having;.  pNew->
0fe0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
0ff0: 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c  rBy;.  pNew->sel
1000: 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c 61 67 73  Flags = selFlags
1010: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  ;.  pNew->op = T
1020: 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77  K_SELECT;.  pNew
1030: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1040: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  t;.  pNew->pOffs
1050: 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1060: 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d  assert( pOffset=
1070: 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20  =0 || pLimit!=0 
1080: 29 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  );.  pNew->addrO
1090: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
10a0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
10b0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
10c0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
10d0: 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c  ailed ) {.    cl
10e0: 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e  earSelect(db, pN
10f0: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ew);.    if( pNe
1100: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 20 73 71  w!=&standin ) sq
1110: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1120: 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65 77 20  pNew);.    pNew 
1130: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1140: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1150: 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73  pSrc!=0 || pPars
1160: 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d  e->nErr>0 );.  }
1170: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21  .  assert( pNew!
1180: 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72  =&standin );.  r
1190: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
11a0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
11b0: 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72  given Select str
11c0: 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f  ucture and all o
11d0: 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  f its substructu
11e0: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
11f0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1200: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65  (sqlite3 *db, Se
1210: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
1220: 70 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65  p ){.    clearSe
1230: 6c 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  lect(db, p);.   
1240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1250: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
1260: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1270: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1280: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
1290: 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d  atement in a com
12a0: 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  pound..*/.static
12b0: 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69 67   Select *findRig
12c0: 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a 70  htmost(Select *p
12d0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70  ){.  while( p->p
12e0: 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e  Next ) p = p->pN
12f0: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ext;.  return p;
1300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1310: 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69 65  1 to 3 identifie
1320: 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68 65  rs preceding the
1330: 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64   JOIN keyword, d
1340: 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20  etermine the.** 
1350: 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52  type of join.  R
1360: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
1370: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 65   constant that e
1380: 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74 79  xpresses that ty
1390: 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f  pe.** in terms o
13a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13b0: 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  bit values:.**.*
13c0: 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a  *     JT_INNER.*
13d0: 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a  *     JT_CROSS.*
13e0: 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a  *     JT_OUTER.*
13f0: 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c  *     JT_NATURAL
1400: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a  .**     JT_LEFT.
1410: 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54 0a  **     JT_RIGHT.
1420: 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74  **.** A full out
1430: 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20 63  er join is the c
1440: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54  ombination of JT
1450: 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49 47  _LEFT and JT_RIG
1460: 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  HT..**.** If an 
1470: 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75 70  illegal or unsup
1480: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1490: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 73   is seen, then s
14a0: 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61  till return.** a
14b0: 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74 20   join type, but 
14c0: 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  put an error in 
14d0: 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
14e0: 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
14f0: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61 72  ite3JoinType(Par
1500: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1510: 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42  n *pA, Token *pB
1520: 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20  , Token *pC){.  
1530: 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30  int jointype = 0
1540: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c  ;.  Token *apAll
1550: 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b  [3];.  Token *p;
1560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1580: 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31 32     0123456789 12
1590: 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38  3456789 12345678
15a0: 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74 69  9 123 */.  stati
15b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65  c const char zKe
15c0: 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72  yText[] = "natur
15d0: 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66 75  aleftouterightfu
15e0: 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20  llinnercross";. 
15f0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
1600: 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69 3b  ruct {.    u8 i;
1610: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
1620: 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64 20  ning of keyword 
1630: 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78 74  text in zKeyText
1640: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68  [] */.    u8 nCh
1650: 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68  ar;    /* Length
1660: 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64 20   of the keyword 
1670: 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  in characters */
1680: 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20 20  .    u8 code;   
1690: 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d    /* Join type m
16a0: 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77  ask */.  } aKeyw
16b0: 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ord[] = {.    /*
16c0: 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c   natural */ { 0,
16d0: 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20    7, JT_NATURAL 
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
16f0: 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20 20  ,.    /* left   
1700: 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f   */ { 6,  4, JT_
1710: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20  LEFT|JT_OUTER   
1720: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1730: 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31 30   outer   */ { 10
1740: 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20  , 5, JT_OUTER   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1760: 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20 20  ,.    /* right  
1770: 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f   */ { 14, 5, JT_
1780: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20  RIGHT|JT_OUTER  
1790: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
17a0: 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39   full    */ { 19
17b0: 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f  , 4, JT_LEFT|JT_
17c0: 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d  RIGHT|JT_OUTER }
17d0: 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20  ,.    /* inner  
17e0: 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f   */ { 23, 5, JT_
17f0: 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20 20  INNER           
1800: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1810: 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38   cross   */ { 28
1820: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54  , 5, JT_INNER|JT
1830: 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20 7d  _CROSS         }
1840: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
1850: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
1860: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1870: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1880: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1890: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
18a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
18b0: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
18c0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
18d0: 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b  ze(aKeyword); j+
18e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
18f0: 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  >n==aKeyword[j].
1900: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
1910: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
1920: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
1930: 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79 77   &zKeyText[aKeyw
1940: 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29  ord[j].i], p->n)
1950: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ==0 ){.        j
1960: 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79 77  ointype |= aKeyw
1970: 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20  ord[j].code;.   
1980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1990: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65    }.    }.    te
19a0: 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20  stcase( j==0 || 
19b0: 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20  j==1 || j==2 || 
19c0: 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20  j==3 || j==4 || 
19d0: 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a  j==5 || j==6 );.
19e0: 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79      if( j>=Array
19f0: 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20 29  Size(aKeyword) )
1a00: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1a10: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
1a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a30: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
1a40: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
1a50: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
1a60: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
1a70: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
1a80: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
1a90: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1aa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1ab0: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1ac0: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1ad0: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1ae0: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1af0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b00: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1b10: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1b20: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
1b30: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
1b40: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
1b50: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
1b60: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
1b70: 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  ( (jointype & JT
1b80: 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20 20  _OUTER)!=0 .    
1b90: 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79 70       && (jointyp
1ba0: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
1bb0: 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54  RIGHT))!=JT_LEFT
1bc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1bd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1be0: 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e  .      "RIGHT an
1bf0: 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49  d FULL OUTER JOI
1c00: 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65  Ns are not curre
1c10: 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29  ntly supported")
1c20: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1c30: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20   JT_INNER;.  }. 
1c40: 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65   return jointype
1c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c60: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
1c70: 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62   column in a tab
1c80: 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  le.  Return -1 i
1c90: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  f the column.** 
1ca0: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
1cb0: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  /.static int col
1cd0: 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a  umnIndex(Table *
1ce0: 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72  pTab, const char
1cf0: 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69   *zCol){.  int i
1d00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1d10: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
1d20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1d30: 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43  StrICmp(pTab->aC
1d40: 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  ol[i].zName, zCo
1d50: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  l)==0 ) return i
1d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1d70: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  1;.}../*.** Sear
1d80: 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20 74  ch the first N t
1d90: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20 66  ables in pSrc, f
1da0: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1db0: 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  t, looking for a
1dc0: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 68  .** table that h
1dd0: 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  as a column name
1de0: 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20  d zCol.  .**.** 
1df0: 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20  When found, set 
1e00: 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43 6f  *piTab and *piCo
1e10: 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69  l to the table i
1e20: 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  ndex and column 
1e30: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20  index.** of the 
1e40: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
1e50: 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45 2e  and return TRUE.
1e60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f  .**.** If not fo
1e70: 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c 53  und, return FALS
1e80: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
1e90: 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1ea0: 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74 20  ndex(.  SrcList 
1eb0: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a 20  *pSrc,       /* 
1ec0: 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73 20  Array of tables 
1ed0: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
1ee0: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
1ef0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f00: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2d   tables in pSrc-
1f10: 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20 2a  >a[] to search *
1f20: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1f30: 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zCol,    /* Name
1f40: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   of the column w
1f50: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
1f60: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61  r */.  int *piTa
1f70: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  b,          /* W
1f80: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
1f90: 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a  rc->a[] here */.
1fa0: 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20    int *piCol    
1fb0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1fc0: 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61  index of pSrc->a
1fd0: 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61  [*piTab].pTab->a
1fe0: 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b  Col[] here */.){
1ff0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2000: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
2010: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
2020: 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20  es in pSrc */.  
2030: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
2040: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2050: 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67   column matching
2060: 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   zCol */..  asse
2070: 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d  rt( (piTab==0)==
2080: 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f  (piCol==0) );  /
2090: 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68 65  * Both or neithe
20a0: 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  r are NULL */.  
20b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b  for(i=0; i<N; i+
20c0: 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63  +){.    iCol = c
20d0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d  olumnIndex(pSrc-
20e0: 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c  >a[i].pTab, zCol
20f0: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
2100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2110: 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  piTab ){.       
2120: 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20 20   *piTab = i;.   
2130: 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43       *piCol = iC
2140: 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
2150: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2160: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2180: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2190: 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69 6d   to add terms im
21a0: 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73 79  plied by JOIN sy
21b0: 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57  ntax to the.** W
21c0: 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
21d0: 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45  ession of a SELE
21e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
21f0: 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69 63  e new term, whic
2200: 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77 69  h.** is ANDed wi
2210: 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  th the existing 
2220: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 73  WHERE clause, is
2230: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
2240: 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f 6c  .**    (tab1.col
2250: 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a  1 = tab2.col2).*
2260: 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31 20  *.** where tab1 
2270: 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20 74  is the iSrc'th t
2280: 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74 20  able in SrcList 
2290: 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69 73  pSrc and tab2 is
22a0: 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31   the .** (iSrc+1
22b0: 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c  )'th. Column col
22c0: 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  1 is column iCol
22d0: 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61 6e  Left of tab1, an
22e0: 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c  d col2 is.** col
22f0: 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f 66  umn iColRight of
2300: 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63   tab2..*/.static
2310: 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65   void addWhereTe
2320: 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
2330: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2340: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
2350: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
2360: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2380: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
2390: 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  in FROM clause *
23a0: 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20 20  /.  int iLeft,  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
23d0: 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20 6a  first table to j
23e0: 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  oin in pSrc */. 
23f0: 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20   int iColLeft,  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2420: 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61 62  umn in first tab
2430: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  le */.  int iRig
2440: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2450: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2460: 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   of second table
2470: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2480: 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20 20  t iColRight,    
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
24b0: 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c 65   in second table
24c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65   */.  int isOute
24d0: 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20 20  rJoin,          
24e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24f0: 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54 45   this is an OUTE
2500: 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72  R join */.  Expr
2510: 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20 20   **ppWhere      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2530: 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52 45  N/OUT: The WHERE
2540: 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20 74   clause to add t
2550: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  o */.){.  sqlite
2560: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
2570: 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31 3b  db;.  Expr *pE1;
2580: 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20 20  .  Expr *pE2;.  
2590: 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73  Expr *pEq;..  as
25a0: 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69 67  sert( iLeft<iRig
25b0: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
25c0: 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68  pSrc->nSrc>iRigh
25d0: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
25e0: 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54  Src->a[iLeft].pT
25f0: 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ab );.  assert( 
2600: 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e  pSrc->a[iRight].
2610: 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d  pTab );..  pE1 =
2620: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2630: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2640: 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65  c, iLeft, iColLe
2650: 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c  ft);.  pE2 = sql
2660: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
2670: 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20 69  Expr(db, pSrc, i
2680: 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68 74  Right, iColRight
2690: 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c 69  );..  pEq = sqli
26a0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
26b0: 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45 32   TK_EQ, pE1, pE2
26c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 71 20  , 0);.  if( pEq 
26d0: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
26e0: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
26f0: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72  perty(pEq, EP_Fr
2700: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2710: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2720: 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f  perty(pEq, EP_To
2730: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
2740: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
2750: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
2760: 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  q, EP_NoReduce);
2770: 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74  .    pEq->iRight
2780: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
2790: 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  )pE2->iTable;.  
27a0: 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73  }.  *ppWhere = s
27b0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
27c0: 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29  , *ppWhere, pEq)
27d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
27e0: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
27f0: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
2800: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
2810: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
2820: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
2830: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2840: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
2850: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
2860: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
2870: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
2880: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
2890: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
28a0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
28b0: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
28c0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
28d0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
28e0: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
28f0: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2900: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2910: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
2920: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2930: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
2940: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
2950: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
2960: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
2970: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
2980: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
2990: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
29a0: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
29b0: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
29c0: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
29d0: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
29e0: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
29f0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2a00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2a10: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2a20: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
2a30: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
2a40: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
2a50: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
2a60: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
2a70: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
2a80: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
2a90: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2aa0: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2ab0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2ac0: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2ad0: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2ae0: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2af0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2b00: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2b10: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2b20: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2b30: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
2b40: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
2b50: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
2b60: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
2b70: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
2b80: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
2b90: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2ba0: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2bb0: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2bc0: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2bd0: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2be0: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2bf0: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2c00: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2c10: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2c20: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2c30: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
2c40: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
2c50: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
2c60: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
2c70: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
2c80: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
2c90: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2ca0: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2cb0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2cc0: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2cd0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2ce0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2cf0: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73  omJoin);.    ass
2d00: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2d10: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
2d20: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
2d30: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
2d40: 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45  VVAProperty(p, E
2d50: 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
2d60: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
2d70: 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c  ble = (i16)iTabl
2d80: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2d90: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2da0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2db0: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2dc0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2dd0: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2de0: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
2df0: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
2e00: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
2e10: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2e20: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
2e30: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
2e40: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2e50: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
2e60: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
2e70: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2e80: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2e90: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2ea0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2eb0: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2ec0: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2ed0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2ee0: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
2ef0: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
2f00: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
2f10: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
2f20: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
2f30: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
2f40: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
2f50: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
2f60: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
2f70: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2f80: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2f90: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2fa0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2fb0: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2fc0: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2fd0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2fe0: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
2ff0: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3000: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3010: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3020: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3030: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3040: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
3050: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
3060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3070: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
3080: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
3090: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
30a0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c0: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
30d0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
30e0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3110: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3120: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3130: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3140: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
3150: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
3160: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3170: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
3180: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
3190: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
31a0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
31b0: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
31c0: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
31d0: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
31e0: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
31f0: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3200: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3210: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3220: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3230: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3240: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
3250: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
3260: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
3270: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
3280: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
3290: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
32a0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
32b0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
32c0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
32d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
32e0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
32f0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
3300: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
3310: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
3320: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
3330: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
3340: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
3350: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
3360: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
3370: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
3380: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
3390: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
33a0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
33b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
33c0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
33d0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
33e0: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
33f0: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
3400: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
3410: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3420: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3430: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67   for(j=0; j<pRig
3440: 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  htTab->nCol; j++
3450: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3460: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
3470: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  e of column in t
3480: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a  he right table *
3490: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  /.        int iL
34a0: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63  eft;     /* Matc
34b0: 68 69 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20  hing left table 
34c0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
34d0: 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74  LeftCol;  /* Mat
34e0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20  ching column in 
34f0: 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a  the left table *
3500: 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  /..        zName
3510: 20 3d 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43   = pRightTab->aC
3520: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
3530: 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e       if( tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
3580: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3590: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
35a0: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
35b0: 6a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j,.             
35c0: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
35d0: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
35e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3600: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
3610: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3620: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
3630: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
3640: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
3650: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
3660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3670: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3680: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
3690: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
36a0: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
36b0: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
36c0: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
36d0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
36e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
36f0: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
3700: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
3710: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
3720: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
3730: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
3740: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3750: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
3760: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
3770: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
3780: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
3790: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
37a0: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
37b0: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
37c0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
37d0: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
37e0: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
37f0: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
3800: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
3810: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
3820: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
3830: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
3840: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
3850: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
3860: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
3870: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
3880: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
3890: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
38a0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
38b0: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
38c0: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
38d0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
38e0: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
38f0: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
3900: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
3910: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
3920: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
3930: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
3940: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3950: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
3960: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
3970: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3980: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3990: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
39a0: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
39b0: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
39c0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
39d0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
39e0: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
39f0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3a00: 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
3a10: 6d 65 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69  me of the term i
3a20: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3a30: 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  se */.        in
3a40: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f  t iLeft;       /
3a50: 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  * Table on the l
3a60: 65 66 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e  eft with matchin
3a70: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  g column name */
3a80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3a90: 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c  ftCol;    /* Col
3aa0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3ab0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3ac0: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
3ad0: 20 20 20 20 20 69 6e 74 20 69 52 69 67 68 74 43       int iRightC
3ae0: 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  ol;   /* Column 
3af0: 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  number of matchi
3b00: 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65  ng column on the
3b10: 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20   right */..     
3b20: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74     zName = pList
3b30: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
3b40: 20 20 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20        iRightCol 
3b50: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52  = columnIndex(pR
3b60: 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b  ightTab, zName);
3b70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 69  .        if( iRi
3b80: 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20  ghtCol<0.       
3b90: 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f    || !tableAndCo
3ba0: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
3bb0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
3bc0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20  ft, &iLeftCol). 
3bd0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
3be0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3bf0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3c00: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3c10: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
3c20: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
3c30: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
3c40: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
3c50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
3c60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3c70: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3c80: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3c90: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
3ca0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69  eftCol, i+1, iRi
3cb0: 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  ghtCol,.        
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3cd0: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3ce0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
3cf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3d00: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
3d10: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
3d20: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
3d30: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
3d40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3d50: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
3d60: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3d70: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
3d80: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
3d90: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
3da0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
3db0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
3dc0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
3dd0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
3de0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
3df0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
3e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
3e10: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
3e20: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
3e30: 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  end */.);../*.**
3e40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
3e50: 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68  hat will push th
3e60: 65 20 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69  e record in regi
3e70: 73 74 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a  sters regData.**
3e80: 20 74 68 72 6f 75 67 68 20 72 65 67 44 61 74 61   through regData
3e90: 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68  +nData-1 onto th
3ea0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
3eb0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
3ec0: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
3ed0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3ee0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3ef0: 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ext */.  SortCtx
3f00: 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20   *pSort,        
3f10: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
3f20: 62 6f 75 74 20 74 68 65 20 4f 52 44 45 52 20 42  bout the ORDER B
3f30: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
3f40: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
3f50: 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
3f60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3f70: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  nt */.  int regD
3f80: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ata,           /
3f90: 2a 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72  * First register
3fa0: 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f   holding data to
3fb0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
3fc0: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
3fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3fe0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
3ff0: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
4000: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
4010: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
4020: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
4030: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
4040: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
4050: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4060: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4080: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4090: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
40a0: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
40b0: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
40c0: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
40d0: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
40e0: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
40f0: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
4100: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
4110: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
4120: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
4130: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
4140: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4170: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4180: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
41c0: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
41d0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
41e0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
4210: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
4220: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
4230: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4250: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4260: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4270: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
42a0: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
42b0: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
42c0: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
42d0: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
42e0: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
42f0: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
4300: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78   nPrefixReg==nEx
4310: 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72  pr+bSeq );.    r
4320: 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61  egBase = regData
4330: 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71 3b   - nExpr - bSeq;
4340: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
4350: 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
4360: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50  nMem + 1;.    pP
4370: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42  arse->nMem += nB
4380: 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ase;.  }.  sqlit
4390: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
43a0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
43b0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
43c0: 61 73 65 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  ase, SQLITE_ECEL
43d0: 5f 44 55 50 29 3b 0a 20 20 69 66 28 20 62 53 65  _DUP);.  if( bSe
43e0: 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  q ){.    sqlite3
43f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4400: 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74  _Sequence, pSort
4410: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42  ->iECursor, regB
4420: 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  ase+nExpr);.  }.
4430: 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65 67    if( nPrefixReg
4440: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4450: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
4460: 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20  Parse, regData, 
4470: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53  regBase+nExpr+bS
4480: 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  eq, nData);.  }.
4490: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
44a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
44b0: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
44c0: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
44d0: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
44e0: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
44f0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4500: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4510: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4520: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4530: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4540: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4550: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4560: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
4570: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
4580: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
4590: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
45a0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
45b0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
45c0: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
45d0: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
45e0: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
45f0: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4610: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4620: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4630: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4640: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4650: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4660: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4670: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4680: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4690: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
46a0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
46b0: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
46c0: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
46d0: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
46e0: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
46f0: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4700: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4710: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4720: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4730: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4750: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4760: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4770: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4780: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4790: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
47a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
47b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
47c0: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
47d0: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
47e0: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
47f0: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4800: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4810: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4820: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4830: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4840: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4850: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4860: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4870: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4880: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4890: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
48a0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
48b0: 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61  ->nField); /* Ma
48c0: 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f  kes OP_Jump belo
48d0: 77 20 74 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20  w testable */.  
48e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
48f0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
4900: 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49  ar*)pKI, P4_KEYI
4910: 4e 46 4f 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  NFO);.    pOp->p
4920: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4930: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4940: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4950: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4960: 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  , 1);.    addrJm
4970: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4980: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4990: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
49a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
49b0: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
49c0: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
49d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
49e0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
49f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4a00: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4a10: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4a20: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4a30: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4a40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4a50: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4a60: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4a70: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4a80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4a90: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
4aa0: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
4ab0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
4ac0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4ad0: 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20  v, addrFirst);. 
4ae0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
4af0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
4b00: 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b  egBase, regPrevK
4b10: 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  ey, pSort->nOBSa
4b20: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
4b30: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
4b40: 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  ddrJmp);.  }.  i
4b50: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
4b60: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
4b70: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
4b80: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
4b90: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
4ba0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
4bb0: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
4bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4bd0: 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75   op, pSort->iECu
4be0: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
4bf0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
4c00: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69  >iLimit ){.    i
4c10: 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
4c20: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
4c30: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
4c40: 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->iOffset ){.   
4c50: 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c     iLimit = pSel
4c60: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a  ect->iOffset+1;.
4c70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c80: 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63   iLimit = pSelec
4c90: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d  t->iLimit;.    }
4ca0: 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
4cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
4cc0: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
4cd0: 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
4ce0: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
4cf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
4d00: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
4d10: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
4d20: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
4d30: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
4d40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4d50: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4d60: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
4d70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
4d80: 50 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69  P_Last, pSort->i
4d90: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
4da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
4db0: 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53  v, OP_Delete, pS
4dc0: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  ort->iECursor);.
4dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
4de0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
4df0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4e00: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
4e10: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
4e20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e30: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
4e40: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
4e50: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
4e60: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
4e70: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20  .  int iOffset, 
4e80: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
4e90: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66   holding the off
4ea0: 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  set counter */. 
4eb0: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
4ec0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4ed0: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
4ee0: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
4ef0: 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30  .  if( iOffset>0
4f00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
4f10: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ;.    addr = sql
4f20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4f30: 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f 66 66  , OP_IfNeg, iOff
4f40: 73 65 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62  set, 0, -1); Vdb
4f50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
4f60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4f70: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
4f80: 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  0, iContinue);. 
4f90: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
4fa0: 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20  v, "skip OFFSET 
4fb0: 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20  records"));.    
4fc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4fd0: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
4fe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
4ff0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68  ode that will ch
5000: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
5010: 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73   the N registers
5020: 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65   starting at iMe
5030: 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74  m.** form a dist
5040: 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61  inct entry.  iTa
5050: 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69  b is a sorting i
5060: 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20  ndex that holds 
5070: 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65  previously.** se
5080: 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  en combinations 
5090: 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e  of the N values.
50a0: 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
50b0: 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a   made in iTab.**
50c0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
50d0: 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77  N values are new
50e0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74  ..**.** A jump t
50f0: 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20  o addrRepeat is 
5100: 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31  made and the N+1
5110: 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70   values are popp
5120: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73  ed from the.** s
5130: 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20  tack if the top 
5140: 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e  N elements are n
5150: 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a  ot distinct..*/.
5160: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
5170: 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73  Distinct(.  Pars
5180: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
5190: 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
51a0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
51b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
51c0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
51d0: 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   A sorting index
51e0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f   used to test fo
51f0: 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a  r distinctness *
5200: 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65  /.  int addrRepe
5210: 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74  at,    /* Jump t
5220: 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69  o here if not di
5230: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20  stinct */.  int 
5240: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  N,             /
5250: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
5260: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  ents */.  int iM
5270: 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em           /* 
5280: 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f  First element */
5290: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  .){.  Vdbe *v;. 
52a0: 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20   int r1;..  v = 
52b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
52c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
52d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
52e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
52f0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
5300: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
5310: 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b  epeat, iMem, N);
5320: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5330: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5340: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5350: 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c  Record, iMem, N,
5360: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
5370: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5380: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
5390: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
53a0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
53b0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69  arse, r1);.}..#i
53c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
53d0: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
53e0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72   Generate an err
53f0: 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
5400: 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64  a SELECT is used
5410: 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70   within a subexp
5420: 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d  ression.** (exam
5430: 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c  ple:  "a IN (SEL
5440: 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65  ECT * FROM table
5450: 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d  )") but it has m
5460: 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c  ore than 1 resul
5470: 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65  t.** column.  We
5480: 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   do this in a su
5490: 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65  broutine because
54a0: 20 74 68 65 20 65 72 72 6f 72 20 75 73 65 64 20   the error used 
54b0: 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e 20 6d  to occur.** in m
54c0: 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2e 20  ultiple places. 
54d0: 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e 6c 79   (The error only
54e0: 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65 20 70   occurs in one p
54f0: 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20 77 65  lace now, but we
5500: 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65 20 73  .** retain the s
5510: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 69 6e  ubroutine to min
5520: 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73 72 75  imize code disru
5530: 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69  ption.).*/.stati
5540: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
5550: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
5560: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
5570: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
5580: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
5590: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
55a0: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
55b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
55c0: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
55d0: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
55e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
55f0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5600: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
5610: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
5620: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5630: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
5640: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
5650: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
5660: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
5670: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5680: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
5690: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
56a0: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
56b0: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
56c0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
56d0: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
56e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
56f0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5700: 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  0;.  }.}.#endif.
5710: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5720: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
5730: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69  e code for the i
5740: 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e  nside of the inn
5750: 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20  er loop.** of a 
5760: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  SELECT..**.** If
5770: 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74   srcTab is negat
5780: 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 45  ive, then the pE
5790: 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73  List expressions
57a0: 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65  .** are evaluate
57b0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
57c0: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
57d0: 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72 63  his row.  If src
57e0: 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f  Tab is.** zero o
57f0: 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61 74  r more, then dat
5800: 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  a is pulled from
5810: 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c 69   srcTab and pELi
5820: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5830: 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d 62 65  .** to get numbe
5840: 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  r columns and th
5850: 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 20 65  e datatype for e
5860: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
5870: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
5880: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
5890: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
58a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
58b0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
58c0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
58d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
58e0: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
58f0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
5900: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
5910: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
5920: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
5930: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
5940: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
5950: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
5960: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
5970: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
5980: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
5990: 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rt,         /* I
59a0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
59b0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
59c0: 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20  ss ORDER BY */. 
59d0: 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44   DistinctCtx *pD
59e0: 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e  istinct, /* If n
59f0: 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e  ot NULL, info on
5a00: 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20   how to process 
5a10: 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65  DISTINCT */.  Se
5a20: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
5a30: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
5a40: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
5a50: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
5a60: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
5a70: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5a80: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
5a90: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
5aa0: 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
5ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
5ac0: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
5ad0: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
5ae0: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  oop */.){.  Vdbe
5af0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
5b00: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
5b10: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
5b20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5b30: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
5b40: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
5b50: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  nt */.  int regR
5b60: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
5b70: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
5b80: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
5b90: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
5ba0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
5bb0: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
5bc0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
5bd0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
5be0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
5bf0: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
5c00: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
5c10: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
5c20: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
5c30: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
5c40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
5c50: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
5c60: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
5c70: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
5c80: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
5c90: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
5ca0: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
5cb0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61  assert( v );.  a
5cc0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
5cd0: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
5ce0: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
5cf0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
5d00: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
5d10: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
5d20: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
5d30: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
5d40: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
5d50: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
5d60: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
5d70: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
5d80: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
5d90: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5da0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5db0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
5dc0: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
5dd0: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
5de0: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
5df0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
5e00: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
5e10: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  =0 ){.    if( pS
5e20: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 72  ort ){.      nPr
5e30: 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72 74 2d  efixReg = pSort-
5e40: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
5e50: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28 70 53  ;.      if( !(pS
5e60: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
5e70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
5e80: 74 65 72 29 20 29 20 6e 50 72 65 66 69 78 52 65  ter) ) nPrefixRe
5e90: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  g++;.      pPars
5ea0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72 65 66  e->nMem += nPref
5eb0: 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ixReg;.    }.   
5ec0: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
5ed0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
5ee0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5ef0: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
5f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73    }else if( pDes
5f10: 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75 6c 74  t->iSdst+nResult
5f20: 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e 6e 4d  Col > pParse->nM
5f30: 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  em ){.    /* Thi
5f40: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  s is an error co
5f50: 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  ndition that can
5f60: 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65 78 61   result, for exa
5f70: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53 45 4c  mple, when a SEL
5f80: 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ECT.    ** on th
5f90: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
5fa0: 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54 20 63  e of an INSERT c
5fb0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72 65 73  ontains more res
5fc0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 6e  ult columns than
5fd0: 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 72  .    ** there ar
5fe0: 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  e columns in the
5ff0: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65   table on the le
6000: 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72 20 77  ft.  The error w
6010: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a 20 20  ill be caught.  
6020: 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72 74 65    ** and reporte
6030: 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20 77 65  d later.  But we
6040: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
6050: 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  re enough memory
6060: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   is allocated.  
6070: 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 6f 74    ** to avoid ot
6080: 68 65 72 20 73 70 75 72 69 6f 75 73 20 65 72 72  her spurious err
6090: 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61 6e 74  ors in the meant
60a0: 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ime. */.    pPar
60b0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73  se->nMem += nRes
60c0: 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44  ultCol;.  }.  pD
60d0: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
60e0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67 52 65  sultCol;.  regRe
60f0: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
6100: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
6110: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
6120: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
6130: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6140: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6150: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
6160: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
6170: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
6180: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
6190: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
61a0: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
61b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
61c0: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
61d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
61e0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
61f0: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6200: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6210: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
6220: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
6230: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
6240: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
6250: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
6260: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
6270: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65  arse, pEList, re
6280: 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20  gResult,.       
6290: 20 20 20 20 20 20 20 20 20 20 20 28 65 44 65 73             (eDes
62a0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 7c 7c 65  t==SRT_Output||e
62b0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
62c0: 69 6e 65 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c  ine)?SQLITE_ECEL
62d0: 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20  _DUP:0);.  }..  
62e0: 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e  /* If the DISTIN
62f0: 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70  CT keyword was p
6300: 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45  resent on the SE
6310: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
6320: 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77   ** and this row
6330: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62   has been seen b
6340: 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e  efore, then do n
6350: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77  ot make this row
6360: 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  .  ** part of th
6370: 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
6380: 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74   if( hasDistinct
6390: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
63a0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
63b0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
63c0: 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
63d0: 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20  T_ORDERED: {.   
63e0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
63f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6400: 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  No longer requir
6410: 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  ed OpenEphemeral
6420: 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20   instr. */.     
6430: 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20     int iJump;   
6440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
6450: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  mp destination *
6460: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
6470: 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
6480: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
6490: 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  w content */..  
64a0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
64b0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
64c0: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
64d0: 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 20          regPrev 
64e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
64f0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
6500: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
6510: 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f  tCol;..        /
6520: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  * Change the OP_
6530: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f  OpenEphemeral co
6540: 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61  ded earlier to a
6550: 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20  n OP_Null.      
6560: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45    ** sets the ME
6570: 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e  M_Cleared bit on
6580: 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
6590: 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ter of the.     
65a0: 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76     ** previous v
65b0: 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  alue.  This will
65c0: 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65   cause the OP_Ne
65d0: 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73   below to always
65e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c  .        ** fail
65f0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 74   on the first it
6600: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
6610: 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65 20  oop even if the 
6620: 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  first.        **
6630: 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c   row is all NULL
6640: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
6650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6660: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
6670: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
6680: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
6690: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
66a0: 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e  GetOp(v, pDistin
66b0: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
66c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
66d0: 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20  de = OP_Null;.  
66e0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20        pOp->p1 = 
66f0: 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  1;.        pOp->
6700: 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20  p2 = regPrev;.. 
6710: 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73         iJump = s
6720: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6730: 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75  tAddr(v) + nResu
6740: 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66  ltCol;.        f
6750: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
6760: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6770: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6780: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
6790: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
67a0: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  , pEList->a[i].p
67b0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
67c0: 20 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f   if( i<nResultCo
67d0: 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l-1 ){.         
67e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp3(v, OP_Ne, r
6800: 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d  egResult+i, iJum
6810: 70 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  p, regPrev+i);. 
6820: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
6830: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
6840: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6850: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6860: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6870: 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Eq, regResult+i
6880: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67  , iContinue, reg
6890: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
68a0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
68b0: 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
68c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
68d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
68e0: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
68f0: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
6900: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
6910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6920: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
6930: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
6940: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
6950: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
6960: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
6970: 69 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d  iJump || pParse-
6980: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6990: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
69a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
69b0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65  , OP_Copy, regRe
69c0: 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e  sult, regPrev, n
69d0: 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20  ResultCol-1);.  
69e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
69f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
6a00: 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
6a10: 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20  UNIQUE: {.      
6a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6a30: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
6a40: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6a50: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
6a60: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6a70: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73      assert( pDis
6a90: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6aa0: 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
6ab0: 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20  _UNORDERED );.  
6ac0: 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
6ad0: 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ct(pParse, pDist
6ae0: 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69  inct->tabTnct, i
6af0: 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c  Continue, nResul
6b00: 74 43 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74 29  tCol, regResult)
6b10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6b20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6b30: 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20     if( pSort==0 
6b40: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
6b50: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
6b60: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
6b70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74     }.  }..  swit
6b80: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
6b90: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
6ba0: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
6bb0: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
6bc0: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
6bd0: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
6be0: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
6bf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6c00: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6c10: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
6c20: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
6c30: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
6c40: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6c50: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6c60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
6c80: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
6c90: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
6ca0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6cb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6cc0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
6cd0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
6ce0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6cf0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
6d00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6d10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
6d20: 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64  nstruct a record
6d30: 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20   from the query 
6d40: 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74  result, but inst
6d50: 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61  ead of.    ** sa
6d60: 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64  ving that record
6d70: 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65  , use it as a ke
6d80: 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d  y to delete elem
6d90: 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ents from.    **
6da0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
6db0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
6dc0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6dd0: 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20  Except: {.      
6de0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6df0: 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74  3(v, OP_IdxDelet
6e00: 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73  e, iParm, regRes
6e10: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
6e20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6e30: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
6e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6e50: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20  UND_SELECT */.. 
6e60: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
6e70: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
6e80: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
6e90: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
6ea0: 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20  se SRT_Fifo:.   
6eb0: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 46 69   case SRT_DistFi
6ec0: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
6ed0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
6ee0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
6ef0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
6f00: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
6f10: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65  nge(pParse, nPre
6f20: 66 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20  fixReg+1);.     
6f30: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6f40: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
6f50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
6f60: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
6f70: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
6f80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f90: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6fa0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6fb0: 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69  ltCol, r1+nPrefi
6fc0: 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  xReg);.#ifndef S
6fd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
6fe0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
6ff0: 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a  SRT_DistFifo ){.
7000: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
7010: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
7020: 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20   DistFifo, then 
7030: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
7040: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
7050: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
7060: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
7070: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
7080: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
7090: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
70a0: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
70b0: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
70c0: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
70d0: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
70e0: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
70f0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
7100: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
7110: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
7120: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
7130: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
7140: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
7150: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
7160: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7170: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
7180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
7190: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
71a0: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
71b0: 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
71c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
71d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71e0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
71f0: 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29  rt, iParm+1, r1)
7200: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7210: 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20  ( pSort==0 );.  
7220: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7230: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7240: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
7250: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
7260: 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65  Sort, p, r1+nPre
7270: 66 69 78 52 65 67 2c 20 31 2c 20 6e 50 72 65 66  fixReg, 1, nPref
7280: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
72a0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
72b0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
72c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
72d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
72e0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
72f0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
7300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7310: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
7320: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
7330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7340: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7350: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
7360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
7370: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
7380: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
7390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
73a0: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
73b0: 50 61 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66  Parse, r1, nPref
73c0: 69 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20  ixReg+1);.      
73d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
73e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
73f0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
7400: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
7410: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
7420: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
7430: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
7440: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
7450: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
7460: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
7470: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
7480: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
7490: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
74a0: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
74b0: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
74c0: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
74d0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
74e0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29   nResultCol==1 )
74f0: 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
7500: 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20  ffSdst =.       
7510: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7520: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
7530: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
7540: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
7550: 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Sdst);.      if(
7560: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
7570: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
7580: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
7590: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
75a0: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
75b0: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
75c0: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
75d0: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
75e0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
75f0: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
7600: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
7610: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
7620: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
7630: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
7640: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
7650: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
7660: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
7670: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
7680: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
7690: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e   regResult, 1, n
76a0: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
76b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
76c0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
76d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
76e0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
76f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
7700: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7710: 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c   regResult,1,r1,
7720: 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
7730: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
7740: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
7750: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
7760: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
7770: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
7780: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7790: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
77a0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
77b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
77c0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
77d0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
77e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
77f0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
7800: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
7810: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
7820: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
7830: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
7840: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
7850: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
7860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7870: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
7880: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
7890: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
78a0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
78b0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
78c0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
78d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
78e0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
78f0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
7900: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
7910: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
7920: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
7930: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
7940: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
7950: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
7960: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
7970: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
7980: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7990: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
79a0: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
79b0: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
79c0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
79d0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
79e0: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
79f0: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31   p, regResult, 1
7a00: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
7a10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7a20: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
7a30: 65 73 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a  esult==iParm );.
7a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
7a50: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
7a60: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
7a70: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7aa0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
7ab0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7ac0: 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53  Y */..    case S
7ad0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20  RT_Coroutine:   
7ae0: 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61      /* Send data
7af0: 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65   to a co-routine
7b00: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
7b10: 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20  _Output: {      
7b20: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
7b30: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20  results */.     
7b40: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7b50: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
7b60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7b70: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
7b80: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  tput );.      if
7b90: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7ba0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
7bb0: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
7bc0: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e   p, regResult, n
7bd0: 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66  ResultCol, nPref
7be0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7bf0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53  lse if( eDest==S
7c00: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
7c10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7c20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
7c30: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
7c40: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  DParm);.      }e
7c50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7c60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7c70: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
7c80: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7c90: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
7ca0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
7cb0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
7cc0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
7cd0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
7ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
7d00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7d10: 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  TE.    /* Write 
7d20: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  the results into
7d30: 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65 75   a priority queu
7d40: 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72 20  e that is order 
7d50: 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20  according to.   
7d60: 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65   ** pDest->pOrde
7d70: 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70  rBy (in pSO).  p
7d80: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69  Dest->iSDParm (i
7d90: 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65 20  n iParm) is the 
7da0: 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20  cursor for an.  
7db0: 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
7dc0: 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c  pSO->nExpr+2 col
7dd0: 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b  umns.  Build a k
7de0: 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72  ey using pSO for
7df0: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a   the first.    *
7e00: 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c  * pSO->nExpr col
7e10: 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20  umns, then make 
7e20: 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72  sure all keys ar
7e30: 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64 69  e unique by addi
7e40: 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61  ng a.    ** fina
7e50: 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f  l OP_Sequence co
7e60: 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20  lumn.  The last 
7e70: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65  column is the re
7e80: 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a  cord as a blob..
7e90: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7ea0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20  SRT_DistQueue:. 
7eb0: 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65 75     case SRT_Queu
7ec0: 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  e: {.      int n
7ed0: 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Key;.      int r
7ee0: 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20  1, r2, r3;.     
7ef0: 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20   int addrTest = 
7f00: 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  0;.      ExprLis
7f10: 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53  t *pSO;.      pS
7f20: 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65  O = pDest->pOrde
7f30: 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  rBy;.      asser
7f40: 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20  t( pSO );.      
7f50: 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70  nKey = pSO->nExp
7f60: 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  r;.      r1 = sq
7f70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
7f80: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72  pParse);.      r
7f90: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
7fa0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7fb0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72  nKey+2);.      r
7fc0: 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20  3 = r2+nKey+1;. 
7fd0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
7fe0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
7ff0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
8000: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
8010: 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68 65  s DistQueue, the
8020: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
8030: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
8040: 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e     ** on a secon
8050: 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  d ephemeral inde
8060: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c  x that holds all
8070: 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70 72   values every pr
8080: 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20  eviously.       
8090: 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65   ** added to the
80a0: 20 71 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20   queue. */.     
80b0: 20 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71     addrTest = sq
80c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
80d0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
80e0: 69 50 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20  iParm+1, 0, .   
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20       regResult, 
8120: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
8130: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
8140: 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  e(v);.      }.  
8150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8160: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8170: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
8180: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
8190: 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44  3);.      if( eD
81a0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
81b0: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
81c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
81d0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
81e0: 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20   iParm+1, r3);. 
81f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8200: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8210: 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55  FLAG_USESEEKRESU
8220: 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LT);.      }.   
8230: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b     for(i=0; i<nK
8240: 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ey; i++){.      
8250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8260: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
8270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8280: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8290: 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d  sult + pSO->a[i]
82a0: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
82b0: 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20   - 1,.          
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r2+i);.      }. 
82e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
82f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
8300: 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32  uence, iParm, r2
8310: 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71  +nKey);.      sq
8320: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8330: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8340: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31  , r2, nKey+2, r1
8350: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8360: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8370: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
8380: 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66  m, r1);.      if
8390: 28 20 61 64 64 72 54 65 73 74 20 29 20 73 71 6c  ( addrTest ) sql
83a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
83b0: 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20  (v, addrTest);. 
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
83d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
83e0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  e, r1);.      sq
83f0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8400: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32  Range(pParse, r2
8410: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
8420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
8430: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8440: 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69  MIT_CTE */....#i
8450: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8460: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
8470: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
8480: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
8490: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
84a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
84b0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
84c0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
84d0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
84e0: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
84f0: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
8500: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
8510: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
8520: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
8530: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
8540: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
8550: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
8560: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
8570: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
8580: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
8590: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
85a0: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
85b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
85c0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
85d0: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
85e0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
85f0: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
8600: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
8610: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
8620: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
8630: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
8640: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
8650: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
8660: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
8670: 2a 2f 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  */.  if( pSort==
8680: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
8690: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
86a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
86b0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
86c0: 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64   iBreak, -1); Vd
86d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
86e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
86f0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
8700: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
8710: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
8720: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
8730: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
8740: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
8750: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8760: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
8770: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
8780: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  ){.  KeyInfo *p 
8790: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
87a0: 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20  cZero(0, .      
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
87c0: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28  eof(KeyInfo) + (
87d0: 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  N+X)*(sizeof(Col
87e0: 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66  lSeq*)+1));.  if
87f0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  ( p ){.    p->aS
8800: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
8810: 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a  &p->aColl[N+X];.
8820: 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20      p->nField = 
8830: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
8840: 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b  XField = (u16)X;
8850: 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e  .    p->enc = EN
8860: 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  C(db);.    p->db
8870: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52   = db;.    p->nR
8880: 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ef = 1;.  }else{
8890: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
88a0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ailed = 1;.  }. 
88b0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
88c0: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
88d0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
88e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b  */.void sqlite3K
88f0: 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49  eyInfoUnref(KeyI
8900: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
8910: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8920: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
8930: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
8940: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
8950: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
8960: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8970: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
8980: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
8990: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
89a0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
89b0: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
89c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
89d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
89e0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
89f0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
8a00: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
8a10: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8a20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8a30: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
8a40: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
8a50: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
8a60: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
8a70: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
8a80: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
8a90: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
8aa0: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
8ab0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8ac0: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
8ad0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
8ae0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
8af0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
8b00: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
8b10: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
8b20: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
8b30: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8b40: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
8b50: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
8b60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
8b70: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
8b80: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8b90: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
8ba0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8bb0: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
8bc0: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
8bd0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8be0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
8bf0: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
8c00: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
8c10: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
8c20: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
8c30: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
8c40: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
8c50: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
8c60: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
8c70: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
8c80: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
8c90: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
8ca0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
8cb0: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
8cc0: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
8cd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
8ce0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
8cf0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
8d00: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
8d10: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
8d20: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
8d30: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
8d40: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
8d50: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
8d60: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
8d70: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
8d80: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
8d90: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
8da0: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
8db0: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
8dc0: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
8dd0: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
8de0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
8df0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
8e00: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
8e10: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8e20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
8e30: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
8e40: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
8e50: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
8e60: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
8e70: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
8e80: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
8e90: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
8ea0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
8eb0: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
8ec0: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
8ed0: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
8ee0: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
8ef0: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
8f00: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
8f10: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8f20: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
8f30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8f40: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
8f50: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
8f60: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
8f70: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
8f80: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
8f90: 2b 6e 45 78 74 72 61 2d 69 53 74 61 72 74 2c 20  +nExtra-iStart, 
8fa0: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
8fb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
8fc0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
8fd0: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
8fe0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
8ff0: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
9000: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
9010: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
9020: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
9030: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
9040: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
9050: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
9060: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
9070: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
9080: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
9090: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
90a0: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
90b0: 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c  -iStart] = pColl
90c0: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
90d0: 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61  SortOrder[i-iSta
90e0: 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  rt] = pItem->sor
90f0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
9100: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
9110: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9120: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9130: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
9140: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
9150: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
9160: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
9170: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
9180: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
9190: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
91a0: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
91b0: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
91c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
91d0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
91e0: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
91f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
9200: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
9210: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
9220: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
9230: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
9240: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
9250: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
9260: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
9270: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
9280: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
9290: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
92a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
92b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
92c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
92d0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
92e0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
92f0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
9300: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
9310: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
9320: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
9330: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
9340: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
9350: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
9360: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
9370: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
9380: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
9390: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
93a0: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
93b0: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
93c0: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
93d0: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
93e0: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
93f0: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
9400: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
9410: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
9420: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
9430: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
9440: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
9450: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
9460: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9470: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
9480: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
9490: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
94a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
94b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
94c0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
94d0: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
94e0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
94f0: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
9500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9510: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
9520: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
9530: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
9540: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
9550: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
9560: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
9570: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
9580: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
9590: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
95a0: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
95b0: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
95c0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
95d0: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
95e0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
95f0: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
9600: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
9610: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
9620: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
9630: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
9640: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
9650: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9660: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
9670: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
9680: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
9690: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
96a0: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
96b0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
96c0: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
96d0: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
96e0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
96f0: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
9700: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
9710: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
9720: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
9730: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
9740: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
9750: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
9760: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9770: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
9780: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9790: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
97a0: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
97b0: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
97c0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
97d0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
97e0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
97f0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9800: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9810: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9820: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9830: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9840: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9850: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
9860: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
9870: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
9880: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
9890: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
98a0: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
98b0: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
98c0: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
98d0: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
98e0: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
98f0: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
9900: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
9910: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
9920: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9930: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
9940: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
9950: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
9960: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
9970: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
9980: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
9990: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
99a0: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
99b0: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
99c0: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
99d0: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
99e0: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
99f0: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
9a00: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
9a10: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
9a20: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
9a30: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
9a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9a50: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
9a60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9a80: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
9a90: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
9ac0: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9ad0: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
9ae0: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9b10: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
9b20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9b30: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
9b40: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
9b50: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b70: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
9b80: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
9b90: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
9ba0: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
9bb0: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
9bc0: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
9bd0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
9be0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
9bf0: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
9c00: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9c10: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
9c20: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
9c30: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
9c40: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
9c50: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
9c60: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
9c70: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
9c80: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
9c90: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
9ca0: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
9cb0: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
9cc0: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
9cd0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
9ce0: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
9cf0: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
9d00: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
9d10: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
9d20: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
9d30: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
9d40: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
9d50: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
9d60: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
9d70: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
9d80: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
9d90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
9da0: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
9db0: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
9dc0: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
9dd0: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
9de0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
9df0: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
9e00: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
9e10: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
9e20: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
9e30: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
9e40: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
9e50: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
9e60: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
9e70: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
9e80: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
9e90: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
9ea0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
9eb0: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
9ec0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9ed0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9ee0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
9ef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
9f00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9f10: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
9f20: 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ort,   /* Inform
9f30: 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44  ation on the ORD
9f40: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
9f50: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
9f60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9f70: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
9f80: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
9f90: 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65   *pDest /* Write
9fa0: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
9fb0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
9fc0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9fd0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ff0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
a000: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a010: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
a020: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a030: 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d  l(v);     /* Jum
a040: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
a050: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
a060: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
a070: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a080: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
a090: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
a0a0: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
a0b0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
a0c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
a0d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
a0e0: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
a0f0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
a100: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
a110: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
a120: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
a130: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
a140: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
a150: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
a160: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a180: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
a190: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
a1a0: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
a1d0: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
a1e0: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 75 38  m sorter */.  u8
a1f0: 20 70 35 3b 20 20 20 20 20 20 20 20 20 20 20 20   p5;            
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a210: 20 70 35 20 70 61 72 61 6d 65 74 65 72 20 66 6f   p5 parameter fo
a220: 72 20 31 73 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20  r 1st OP_Column 
a230: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  */.  int i;.  in
a240: 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20 20  t bSeq;         
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a260: 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72 20   True if sorter 
a270: 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73 20  record includes 
a280: 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66 64  seq. no. */.#ifd
a290: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a2a0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
a2b0: 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  S.  struct ExprL
a2c0: 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78  ist_item *aOutEx
a2d0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b   = p->pEList->a;
a2e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
a2f0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
a310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a320: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
a330: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
a340: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
a350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a360: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
a370: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
a380: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
a390: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
a3a0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
a3b0: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
a3c0: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
a3d0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
a3e0: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
a3f0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
a400: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
a410: 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d   0;.    regRow =
a420: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20   pDest->iSdst;. 
a430: 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20 6e     nSortData = n
a440: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
a450: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
a460: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
a470: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
a480: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
a490: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
a4a0: 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  );.    nSortData
a4b0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79   = 1;.  }.  nKey
a4c0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
a4d0: 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  pr - pSort->nOBS
a4e0: 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  at;.  if( pSort-
a4f0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
a500: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
a510: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f  ){.    int regSo
a520: 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65  rtOut = ++pParse
a530: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72  ->nMem;.    iSor
a540: 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tTab = pParse->n
a550: 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Tab++;.    if( p
a560: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
a570: 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f 6e   ){.      addrOn
a580: 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ce = sqlite3Code
a590: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
a5a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a5b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a5c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a5d0: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f  _OpenPseudo, iSo
a5e0: 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75  rtTab, regSortOu
a5f0: 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44  t, nKey+1+nSortD
a600: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64  ata);.    if( ad
a610: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
a620: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a630: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
a640: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
a650: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a660: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
a670: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
a680: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a690: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a6a0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a6b0: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a6c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a6d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a6e0: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
a6f0: 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20  regSortOut);.   
a700: 20 70 35 20 3d 20 4f 50 46 4c 41 47 5f 43 4c 45   p5 = OPFLAG_CLE
a710: 41 52 43 41 43 48 45 3b 0a 20 20 20 20 62 53 65  ARCACHE;.    bSe
a720: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
a730: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
a740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a750: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
a760: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
a770: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a780: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
a790: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
a7a0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
a7b0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
a7c0: 3b 0a 20 20 20 20 70 35 20 3d 20 30 3b 0a 20 20  ;.    p5 = 0;.  
a7d0: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
a7e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 6f    for(i=0; i<nSo
a7f0: 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20  rtData; i++){.  
a800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a810: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
a820: 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e 4b 65 79  , iSortTab, nKey
a830: 2b 62 53 65 71 2b 69 2c 20 72 65 67 52 6f 77 2b  +bSeq+i, regRow+
a840: 69 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 30  i);.    if( i==0
a850: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
a860: 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20  angeP5(v, p5);. 
a870: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
a880: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
a890: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
a8a0: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
a8b0: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
a8c0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
a8d0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
a8e0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
a8f0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
a900: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
a910: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
a920: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
a930: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
a940: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
a950: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
a970: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
a980: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
a990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a9a0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
a9b0: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
a9c0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
a9d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a9e0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
a9f0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
aa00: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
aa10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
aa20: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
aa30: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
aa40: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
aa50: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
aa60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
aa70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
aa80: 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f  regRow, 1, regRo
aa90: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 44               &pD
aab0: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
aac0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
aad0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
aae0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
aaf0: 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20  egRow, 1);.     
ab00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab10: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
ab20: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
ab30: 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  wid);.      brea
ab40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ab50: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
ab60: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
ab70: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
ab80: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
ab90: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ve(pParse, regRo
aba0: 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  w, iParm, 1);.  
abb0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
abc0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
abd0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
abe0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
abf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
ac00: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
ac10: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
ac20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
ac30: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
ac40: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
ac50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
ac60: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
ac70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ac80: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
ac90: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
aca0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
acb0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
acc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
acd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
ace0: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
acf0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
ad00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ad10: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
ad20: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
ad30: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
ad40: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
ad50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ad60: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ad70: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
ad80: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
ad90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ada0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
adb0: 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73  egRowid ){.    s
adc0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
add0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
ade0: 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
adf0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ae00: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
ae10: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
ae20: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
ae30: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
ae40: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ae50: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
ae60: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
ae70: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
ae80: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
ae90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
aea0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
aeb0: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
aec0: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
aed0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
aee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
aef0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
af00: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
af10: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
af20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
af30: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
af40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
af50: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
af60: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
af70: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
af80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
af90: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
afa0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
afb0: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
afc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
afd0: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
afe0: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
aff0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
b000: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
b010: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
b020: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
b030: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
b040: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
b050: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
b060: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
b070: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
b080: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
b090: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
b0a0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
b0b0: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
b0c0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
b0d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b0e0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
b0f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b100: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
b110: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
b120: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
b130: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
b140: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
b150: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
b160: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
b170: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
b180: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
b190: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
b1a0: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
b1b0: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
b1c0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
b1d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
b1e0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
b1f0: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
b200: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
b210: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
b220: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
b230: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
b240: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
b250: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
b260: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
b270: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
b280: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
b290: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
b2a0: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
b2b0: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
b2c0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
b2d0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
b2e0: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
b2f0: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
b300: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
b310: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
b320: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
b330: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
b340: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
b350: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
b360: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
b370: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b380: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
b390: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
b3a0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
b3b0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b3c0: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
b3d0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
b3e0: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
b3f0: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c  nTypeImpl(A,B,C,
b400: 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  D,E,F).static co
b410: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
b420: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
b430: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
b440: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
b450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
b460: 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  rigDb,.  const c
b470: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c  har **pzOrigTab,
b480: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
b490: 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20  pzOrigCol,.  u8 
b4a0: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20  *pEstWidth.){.  
b4b0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
b4c0: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
b4d0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
b4e0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
b4f0: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
b500: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65  .#else /* if !de
b510: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b520: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
b530: 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ATA) */.# define
b540: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
b550: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
b560: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73  ypeImpl(A,B,F).s
b570: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b580: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
b590: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
b5a0: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
b5b0: 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74  Expr,.  u8 *pEst
b5c0: 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20  Width.){.#endif 
b5d0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
b5e0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
b5f0: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20  _METADATA) */.  
b600: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
b610: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
b620: 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20    u8 estWidth = 
b630: 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  1;..  if( NEVER(
b640: 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43  pExpr==0) || pNC
b650: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
b660: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
b670: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
b680: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
b690: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
b6a0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
b6b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b6c0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
b6d0: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
b6e0: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
b6f0: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
b700: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
b710: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
b720: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
b730: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
b740: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
b750: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
b760: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
b770: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
b780: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
b790: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
b7a0: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
b7b0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
b7c0: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
b7d0: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
b7e0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
b7f0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
b800: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
b810: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
b820: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
b830: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
b840: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
b850: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
b860: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
b870: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b880: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
b890: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
b8a0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
b8b0: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
b8c0: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
b8d0: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
b8e0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
b8f0: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
b900: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
b910: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
b920: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
b930: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
b940: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
b950: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
b960: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
b970: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
b980: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
b990: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
b9a0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
b9b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b9c0: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
b9d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b9e0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
b9f0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
ba00: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
ba10: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
ba20: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
ba30: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
ba40: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
ba50: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
ba60: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
ba70: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
ba80: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
ba90: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
baa0: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
bab0: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
bac0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
bad0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
bae0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
baf0: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
bb00: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
bb10: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
bb20: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
bb30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
bb40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bb50: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
bb60: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
bb70: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
bb80: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
bb90: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
bba0: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
bbb0: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
bbc0: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
bbd0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
bbe0: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
bbf0: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
bc00: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
bc10: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
bc20: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
bc30: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
bc40: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
bc50: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
bc60: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
bc70: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
bc80: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
bc90: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
bca0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
bcb0: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
bcc0: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
bcd0: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
bce0: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
bcf0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
bd00: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
bd10: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
bd20: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
bd30: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
bd40: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
bd50: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
bd60: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
bd70: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
bd80: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
bd90: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
bda0: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
bdb0: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
bdc0: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
bdd0: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
bde0: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
bdf0: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
be00: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
be10: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
be20: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
be30: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
be40: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
be50: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
be60: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
be70: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
be80: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
be90: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
bea0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
beb0: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41   iCol>=0 && ALWA
bec0: 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  YS(iCol<pS->pELi
bed0: 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
bee0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
bef0: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
bf00: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
bf10: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
bf20: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
bf30: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
bf40: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
bf50: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
bf60: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
bf70: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
bf80: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
bf90: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
bfa0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
bfb0: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
bfc0: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
bfd0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
bfe0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
bff0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
c000: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
c010: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c020: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c030: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
c040: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
c050: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c060: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c070: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c080: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
c090: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
c0a0: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
c0b0: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c0d0: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
c0e0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
c0f0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
c100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
c110: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
c120: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c130: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c140: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
c150: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
c160: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
c170: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
c180: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c190: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c1a0: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
c1b0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c1c0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c1d0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c1e0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
c1f0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
c200: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
c210: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
c220: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
c230: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
c240: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
c250: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
c260: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
c270: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c280: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
c290: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
c2a0: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
c2b0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
c2c0: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
c2d0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
c2e0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
c2f0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
c300: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
c310: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
c320: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
c330: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
c340: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
c350: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
c360: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c370: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c380: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c390: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c3a0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
c3b0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c3c0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
c3d0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
c3e0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
c3f0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
c400: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
c410: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c420: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
c430: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c440: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
c450: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
c460: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
c470: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
c480: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
c490: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
c4a0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
c4b0: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
c4c0: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
c4d0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
c4e0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
c4f0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
c500: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
c510: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
c520: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
c530: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
c540: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
c550: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
c560: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
c570: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
c580: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c590: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
c5a0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
c5b0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
c5c0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
c5d0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
c5e0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c5f0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
c600: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c610: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
c620: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
c630: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
c640: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
c650: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c660: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
c670: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c680: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
c690: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
c6a0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
c6b0: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
c6c0: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
c6d0: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
c6e0: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
c6f0: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
c700: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
c710: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
c720: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
c730: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
c740: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
c750: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
c760: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
c770: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
c780: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
c790: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
c7a0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
c7b0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
c7c0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
c7d0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
c7e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c7f0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
c800: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
c810: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
c820: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
c830: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
c840: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
c850: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
c860: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
c870: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
c880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
c890: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
c8a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
c8b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
c8c0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
c8d0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
c8e0: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
c8f0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c900: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
c910: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c920: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
c930: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
c940: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
c950: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
c960: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c970: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c980: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c990: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
c9a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
c9b0: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
c9c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
c9d0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
c9e0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
c9f0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
ca00: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
ca10: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
ca20: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
ca30: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
ca40: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
ca50: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
ca60: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
ca70: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
ca80: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
ca90: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
caa0: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
cab0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
cac0: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
cad0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
cae0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
caf0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
cb00: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
cb10: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cb20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cb30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cb40: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
cb50: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
cb60: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
cb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cb80: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
cb90: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
cba0: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
cbb0: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
cbc0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cbd0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cbe0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
cbf0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
cc00: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
cc10: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
cc20: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
cc30: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
cc40: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
cc50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
cc60: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
cc70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
cc80: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
cc90: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
cca0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
ccb0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
ccc0: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
ccd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
cce0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
ccf0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
cd00: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
cd10: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
cd20: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
cd30: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
cd40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cd50: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
cd60: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
cd70: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
cd80: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
cd90: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
cda0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
cdb0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
cdc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
cdd0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
cde0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
cdf0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
ce00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ce10: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
ce20: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
ce30: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
ce40: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
ce50: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
ce60: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
ce70: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
ce80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
ce90: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
cea0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
ceb0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
cec0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
ced0: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
cee0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
cef0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
cf00: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
cf10: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
cf20: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
cf30: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
cf40: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
cf50: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
cf60: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
cf70: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
cf80: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
cf90: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
cfa0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
cfb0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
cfc0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
cfd0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
cfe0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
cff0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d000: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
d010: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d020: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
d030: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
d040: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
d050: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
d060: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d070: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d080: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d090: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d0a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
d0b0: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
d0c0: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
d0d0: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
d0e0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
d0f0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
d100: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
d110: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
d120: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
d130: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
d140: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
d150: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
d160: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
d170: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
d180: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
d190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d1a0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
d1b0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
d1c0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
d1d0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
d1e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
d1f0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
d200: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
d210: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
d220: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
d230: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
d240: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d250: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
d260: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
d270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d280: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
d290: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
d2a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d2b0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
d2c0: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
d2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d2e0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d2f0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
d310: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d320: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d330: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
d340: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d350: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
d360: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
d370: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
d380: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
d390: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d3a0: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
d3b0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
d3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d3d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d3e0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d3f0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
d400: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
d410: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
d420: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d430: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d440: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
d450: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
d470: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d480: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
d490: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
d4a0: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
d4b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
d4c0: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
d4d0: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
d4e0: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
d4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d500: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d510: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
d520: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d530: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
d540: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
d550: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
d560: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
d570: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
d580: 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69  ession list (whi
d590: 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65  ch is really the
d5a0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d5b0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72  ions.** that for
d5c0: 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  m the result set
d5d0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
d5e0: 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20  tement) compute 
d5f0: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63  appropriate.** c
d600: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d610: 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75  a table that wou
d620: 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ld hold the expr
d630: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
d640: 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61  ** All column na
d650: 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71  mes will be uniq
d660: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ue..**.** Only t
d670: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
d680: 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43  are computed.  C
d690: 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c  olumn.zType, Col
d6a0: 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e  umn.zColl,.** an
d6b0: 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  d other fields o
d6c0: 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72  f Column are zer
d6d0: 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oed..**.** Retur
d6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d6f0: 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65  uccess.  If a me
d700: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
d710: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
d720: 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a   store NULL in *
d730: 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a  paCol and 0 in *
d740: 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e  pnCol and return
d750: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
d760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
d770: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d780: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
d790: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d7a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d7b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d7c0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
d7d0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
d7e0: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
d7f0: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
d800: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
d810: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d820: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
d830: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
d840: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
d850: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
d860: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
d870: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
d880: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d890: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d8a0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
d8b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
d8c0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d8e0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
d8f0: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d910: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
d920: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
d930: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
d940: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
d950: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
d960: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
d970: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
d980: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d9a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
d9b0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d9c0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20  t */.  Expr *p; 
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d9f0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65   for a single re
da00: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  sult column */. 
da10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da30: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
da40: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da60: 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20  Size of name in 
da70: 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66  zName[] */..  if
da80: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
da90: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
daa0: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
dab0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
dac0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
dad0: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
dae0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
daf0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
db00: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
db10: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
db20: 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  }.  *pnCol = nCo
db30: 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
db40: 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
db50: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
db60: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
db70: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61  .    /* Get an a
db80: 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20  ppropriate name 
db90: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  for the column. 
dba0: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71     */.    p = sq
dbb0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
dbc0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
dbd0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
dbe0: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
dbf0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
dc00: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
dc10: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
dc20: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
dc30: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
dc40: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
dc50: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
dc60: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
dc70: 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
dc80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc90: 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20   Expr *pColExpr 
dca0: 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70  = p;  /* The exp
dcb0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20  ression that is 
dcc0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  the result colum
dcd0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
dce0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
dcf0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73       /* Table as
dd00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dd10: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
dd20: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
dd30: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44  olExpr->op==TK_D
dd40: 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OT ){.        pC
dd50: 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70  olExpr = pColExp
dd60: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
dd70: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45     assert( pColE
dd80: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
dd90: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c  }.      if( pCol
dda0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
ddb0: 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43  UMN && ALWAYS(pC
ddc0: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29  olExpr->pTab!=0)
ddd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
dde0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
ddf0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
de00: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
de10: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
de20: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
de30: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
de40: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
de50: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
de60: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
de70: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
de80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
de90: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
deb0: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
dec0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
ded0: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
dee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
def0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
df00: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
df10: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
df20: 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
df30: 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
df40: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
df50: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
df60: 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d   "%s", pColExpr-
df70: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
df80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
df90: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
dfa0: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
dfb0: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
dfc0: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
dfd0: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
dfe0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
dff0: 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73  (db, "%s", pELis
e000: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
e010: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e020: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e030: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
e040: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e050: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
e070: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e080: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
e090: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
e0a0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
e0b0: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
e0c0: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
e0d0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
e0e0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
e0f0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
e100: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
e110: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
e120: 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30  .    for(j=cnt=0
e130: 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<i; j++){.   
e140: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
e150: 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e  rICmp(aCol[j].zN
e160: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
e170: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e180: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
e190: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
e1a0: 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20   for(k=nName-1; 
e1b0: 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  k>1 && sqlite3Is
e1c0: 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b  digit(zName[k]);
e1d0: 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20   k--){}.        
e1e0: 69 66 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d  if( k>=0 && zNam
e1f0: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
e200: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
e210: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
e220: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
e230: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
e240: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
e250: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
e260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
e270: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
e280: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e290: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
e2a0: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
e2b0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
e2c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
e2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
e2e0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
e2f0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
e300: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e310: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
e320: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
e330: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
e340: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
e350: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
e360: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
e370: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
e380: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
e390: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e3a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e3b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e3c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e3d0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
e3e0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
e3f0: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
e400: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
e410: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
e420: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
e430: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
e440: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
e450: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
e460: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
e470: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
e480: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
e490: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
e4a0: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
e4b0: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
e4c0: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
e4d0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
e4e0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
e4f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
e500: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
e510: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
e520: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
e530: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
e540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e550: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
e560: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
e570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e580: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e590: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
e5a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
e5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
e5c0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
e5d0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
e5e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
e5f0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
e600: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
e610: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
e620: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
e630: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
e640: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e650: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
e660: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
e670: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
e680: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
e690: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
e6a0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
e6b0: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
e6c0: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
e6d0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
e6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
e6f0: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
e700: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
e710: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
e720: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
e730: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
e740: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e750: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
e760: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e770: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
e780: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
e790: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
e7a0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
e7b0: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
e7c0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
e7d0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
e7e0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
e7f0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e800: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
e810: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
e820: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
e830: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
e840: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
e850: 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26  &sNC, p,0,0,0, &
e860: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20  pCol->szEst));. 
e870: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
e880: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
e890: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
e8a0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
e8b0: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
e8c0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
e8d0: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
e8e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
e8f0: 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  NE;.    pColl = 
e900: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
e910: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
e920: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
e930: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
e940: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
e950: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
e960: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
e970: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
e980: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
e990: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
e9a0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
e9b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
e9c0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
e9d0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
e9e0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
e9f0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ea00: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
ea10: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
ea20: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
ea30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
ea40: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
ea50: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
ea60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ea70: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
ea80: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
ea90: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
eaa0: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
eab0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
eac0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
ead0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
eae0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
eaf0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
eb00: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
eb10: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
eb20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
eb30: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
eb40: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
eb50: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
eb60: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
eb70: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
eb80: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
eb90: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
eba0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
ebb0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
ebc0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
ebd0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ebe0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
ebf0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
ec00: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
ec10: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
ec20: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
ec30: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
ec40: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
ec50: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
ec60: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
ec70: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
ec80: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
ec90: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
eca0: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
ecb0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
ecc0: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 73 65 6c  048576) );.  sel
ecd0: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
ece0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
ecf0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
ed00: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
ed10: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
ed20: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
ed30: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
ed40: 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
ed50: 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
ed60: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
ed70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ed80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
ed90: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
eda0: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
edb0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
edc0: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
edd0: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
ede0: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
edf0: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
ee00: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
ee10: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
ee20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
ee30: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
ee40: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
ee50: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
ee60: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
ee70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
ee80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
ee90: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
eea0: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
eeb0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
eec0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
eed0: 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20  eate(pParse);.  
eee0: 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
eef0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
ef00: 50 5f 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  P_Init);.    if(
ef10: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
ef20: 65 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70  el==0.     && Op
ef30: 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
ef40: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c  d(pParse->db,SQL
ef50: 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
ef60: 73 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  st).    ){.     
ef70: 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74   pParse->okConst
ef80: 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20  Factor = 1;.    
ef90: 7d 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  }..  }.  return 
efa0: 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  v;.}.../*.** Com
efb0: 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20  pute the iLimit 
efc0: 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c  and iOffset fiel
efd0: 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ds of the SELECT
efe0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
eff0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f000: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  set expressions.
f010: 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66    pLimit and pOf
f020: 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78  fset hold the ex
f030: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
f040: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
f050: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
f060: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
f070: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
f080: 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
f090: 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
f0a0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
f0b0: 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
f0c0: 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
f0d0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
f0e0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
f0f0: 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
f100: 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
f110: 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
f120: 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
f130: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
f140: 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
f150: 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
f160: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
f170: 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
f180: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
f190: 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
f1a0: 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
f1b0: 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
f1c0: 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
f1d0: 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
f1e0: 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  by pLimit and pO
f1f0: 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61  ffset.  iLimit a
f200: 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68  nd.** iOffset sh
f210: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
f220: 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72  reset to appropr
f230: 69 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c  iate default val
f240: 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72  ues (zero).** pr
f250: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
f260: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
f270: 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74 20 72  ** The iOffset r
f280: 65 67 69 73 74 65 72 20 28 69 66 20 69 74 20 65  egister (if it e
f290: 78 69 73 74 73 29 20 69 73 20 69 6e 69 74 69 61  xists) is initia
f2a0: 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
f2b0: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46  ue.** of the OFF
f2c0: 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74  SET.  The iLimit
f2d0: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
f2e0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
f2f0: 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20  T.  Register.** 
f300: 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69  iOffset+1 is ini
f310: 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49  tialized to LIMI
f320: 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  T+OFFSET..**.** 
f330: 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d  Only if pLimit!=
f340: 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20  0 or pOffset!=0 
f350: 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67  do the limit reg
f360: 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65  isters get.** re
f370: 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e  defined.  The UN
f380: 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
f390: 20 75 73 65 73 20 74 68 69 73 20 70 72 6f 70 65   uses this prope
f3a0: 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20  rty to force.** 
f3b0: 74 68 65 20 72 65 75 73 65 20 6f 66 20 74 68 65  the reuse of the
f3c0: 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20   same limit and 
f3d0: 6f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 73  offset registers
f3e0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
f3f0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
f400: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
f410: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d   void computeLim
f420: 69 74 52 65 67 69 73 74 65 72 73 28 50 61 72 73  itRegisters(Pars
f430: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
f440: 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b  t *p, int iBreak
f450: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30  ){.  Vdbe *v = 0
f460: 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
f470: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   0;.  int iOffse
f480: 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  t;.  int addr1, 
f490: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  n;.  if( p->iLim
f4a0: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
f4b0: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
f4c0: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
f4d0: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
f4e0: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
f4f0: 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74  ontroversy about
f500: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
f510: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
f520: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
f530: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
f540: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
f550: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
f560: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
f570: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
f580: 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
f590: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
f5a0: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c   p->pOffset==0 |
f5b0: 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  | p->pLimit!=0 )
f5c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69  ;.  if( p->pLimi
f5d0: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d  t ){.    p->iLim
f5e0: 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b  it = iLimit = ++
f5f0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f600: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
f610: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f620: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
f630: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f640: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
f650: 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
f660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f680: 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
f690: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
f6a0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f6b0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
f6c0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
f6d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f6e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
f6f0: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
f700: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f710: 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c   n>=0 && p->nSel
f720: 65 63 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b  ectRow>(u64)n ){
f730: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
f740: 65 63 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20  ectRow = n;.    
f750: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f760: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f770: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
f780: 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
f790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f7a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
f7b0: 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
f7c0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
f7d0: 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
f7e0: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
f7f0: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
f800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f810: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
f820: 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  o, iLimit, iBrea
f830: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
f840: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
f850: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
f860: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
f870: 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b  t = iOffset = ++
f880: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f890: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
f8a0: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
f8b0: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
f8c0: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
f8d0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  fset */.      sq
f8e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
f8f0: 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
f900: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
f910: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f920: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
f930: 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Int, iOffset); V
f940: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f950: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
f960: 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
f970: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f980: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
f990: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f9a0: 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b  IfPos, iOffset);
f9b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f9c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f9d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f9e0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
f9f0: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
fa00: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fa10: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
fa20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa30: 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c  p3(v, OP_Add, iL
fa40: 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20 69  imit, iOffset, i
fa50: 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20  Offset+1);.     
fa60: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fa70: 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
fa80: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
fa90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
faa0: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
fab0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
fac0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
fad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fae0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
faf0: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
fb00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb10: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fb20: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
fb30: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fb40: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
fb50: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
fb60: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
fb70: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
fb80: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
fb90: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
fba0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
fbb0: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
fbc0: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
fbd0: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
fbe0: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
fbf0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
fc00: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
fc10: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
fc20: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
fc30: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
fc40: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
fc50: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
fc60: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
fc70: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
fc80: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
fc90: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
fca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
fcb0: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
fcc0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
fcd0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
fce0: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
fcf0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
fd00: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
fd10: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
fd20: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
fd30: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
fd40: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
fd50: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
fd60: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
fd70: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
fd80: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
fd90: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
fda0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
fdb0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
fdc0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
fdd0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
fde0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
fdf0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
fe00: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
fe10: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
fe20: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
fe30: 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
fe40: 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
fe50: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
fe60: 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
fe70: 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
fe80: 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
fe90: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
fea0: 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
feb0: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
fec0: 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
fed0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
fee0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
fef0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
ff00: 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
ff10: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
ff20: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
ff30: 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
ff40: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
ff50: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
ff60: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
ff70: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
ff80: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
ff90: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
ffa0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
ffb0: 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
ffc0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
ffd0: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
ffe0: 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
fff0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
10000 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
10010 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10020 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
10030 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
10040 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
10050 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
10060 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
10070 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10080 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
10090 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
100a0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
100b0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
100c0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
100d0 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
100e0 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
100f0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
10100 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
10110 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
10120 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
10130 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
10140 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
10150 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
10160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10170 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
10180 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
10190 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
101a0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
101b0 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
101c0 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
101d0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
101e0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
101f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
10200 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
10210 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
10220 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
10230 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
10240 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
10250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
10260 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
10270 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
10280 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
10290 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
102a0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
102b0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
102c0 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
102d0 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
102e0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
102f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10300 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
10310 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
10320 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
10330 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
10340 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
10350 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
10360 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
10370 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
10380 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
10390 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
103a0 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
103b0 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
103e0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
103f0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
10400 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
10450 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
10460 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
10470 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
10480 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
10490 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
104a0 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
104b0 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
104c0 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72  ist->a[].isRecur
104d0 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a  sive flag..**.**
104e0 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   The setup-query
104f0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65   runs once to ge
10500 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61  nerate an initia
10510 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68  l set of rows th
10520 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20  at go.** into a 
10530 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f  Queue table.  Ro
10540 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ws are extracted
10550 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20   from the Queue 
10560 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20  table one by.** 
10570 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65  one.  Each row e
10580 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
10590 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f  eue is output to
105a0 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68   pDest.  Then th
105b0 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72  e single.** extr
105c0 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69  acted row (now i
105d0 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74  n the iCurrent t
105e0 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68  able) becomes th
105f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
10600 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61  .** recursive-ta
10610 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73  ble for a recurs
10620 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20  ive-query run.  
10630 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  The output of th
10640 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  e recursive-quer
10650 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61  y.** is added ba
10660 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ck into the Queu
10670 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61  e table.  Then a
10680 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78  nother row is ex
10690 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
106a0 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74  ue.** and the it
106b0 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  eration continue
106c0 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  s until the Queu
106d0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
106e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
106f0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70  ompound query op
10700 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
10710 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74  then no duplicat
10720 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a  e rows are ever.
10730 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
10740 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10750 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74  .  The iDistinct
10760 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63   table keeps a c
10770 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a  opy of all rows.
10780 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65  ** that have eve
10790 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  r been inserted 
107a0 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63  into Queue and c
107b0 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73  auses duplicates
107c0 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72   to be.** discar
107d0 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65  ded.  If the ope
107e0 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41  rator is UNION A
107f0 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61  LL, then duplica
10800 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  tes are allowed.
10810 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71  .** .** If the q
10820 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45  uery has an ORDE
10830 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69  R BY, then entri
10840 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  es in the Queue 
10850 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69  table are kept i
10860 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
10870 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73  der and the firs
10880 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61  t entry is extra
10890 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79  cted for each cy
108a0 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a  cle.  Without.**
108b0 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
108c0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
108d0 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a   just a FIFO..**
108e0 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63  .** If a LIMIT c
108f0 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65  lause is provide
10900 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  d, then the iter
10910 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65  ation stops afte
10920 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20  r LIMIT rows.** 
10930 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74  have been output
10940 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49   to pDest.  A LI
10950 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e  MIT of zero mean
10960 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72  s to output no r
10970 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67  ows and a.** neg
10980 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e  ative LIMIT mean
10990 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20  s to output all 
109a0 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20  rows.  If there 
109b0 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45  is also an OFFSE
109c0 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68  T clause.** with
109d0 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
109e0 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
109f0 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73  t OFFSET outputs
10a00 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72   are discarded r
10a10 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65  ather.** than be
10a20 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73  ing sent to pDes
10a30 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f  t.  The LIMIT co
10a40 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  unt does not beg
10a50 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f  in until after O
10a60 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61  FFSET.** rows ha
10a70 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e  ve been skipped.
10a80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10a90 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
10aa0 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61  rsiveQuery(.  Pa
10ab0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10ac0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10ad0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10ae0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10af0 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69    /* The recursi
10b00 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20  ve SELECT to be 
10b10 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
10b20 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
10b30 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
10b40 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
10b50 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
10b60 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
10b70 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
10b80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
10b90 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  e recursive quer
10ba0 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  y */.  int nCol 
10bb0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
10bc0 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  pr;  /* Number o
10bd0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
10be0 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
10bf0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
10c00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
10c10 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
10c20 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
10c30 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10c40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
10c50 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  etup = p->pPrior
10c60 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70  ;   /* The setup
10c70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
10c80 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
10c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
10ca0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
10cb0 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20    int addrCont, 
10cc0 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20  addrBreak;      
10cd0 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20  /* CONTINUE and 
10ce0 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20  BREAK addresses 
10cf0 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  */.  int iCurren
10d00 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
10d10 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e     /* The Curren
10d20 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
10d30 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20   regCurrent;    
10d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10d50 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43  gister holding C
10d60 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
10d70 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20    int iQueue;   
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62  /* The Queue tab
10da0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73  le */.  int iDis
10db0 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20  tinct = 0;      
10dc0 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75        /* To ensu
10dd0 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74  re unique result
10de0 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20  s if UNION */.  
10df0 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f  int eDest = SRT_
10e00 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Fifo;         /*
10e10 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f   How to write to
10e20 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65   Queue */.  Sele
10e30 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65  ctDest destQueue
10e40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  ;         /* Sel
10e50 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69  ectDest targetti
10e60 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62  ng the Queue tab
10e70 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10ea0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
10eb0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10ed0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70  lt code */.  Exp
10ee0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
10ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10f00 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10f10 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
10f20 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20  mit, *pOffset;  
10f30 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49       /* Saved LI
10f40 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
10f50 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
10f60 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20  , regOffset;    
10f70 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75    /* Registers u
10f80 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64  sed by LIMIT and
10f90 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a   OFFSET */..  /*
10fa0 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a   Obtain authoriz
10fb0 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65  ation to do a re
10fc0 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
10fd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
10fe0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10ff0 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
11000 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
11010 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  urn;..  /* Proce
11020 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  ss the LIMIT and
11030 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c   OFFSET clauses,
11040 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a   if they exist *
11050 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20  /.  addrBreak = 
11060 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11070 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
11080 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
11090 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
110a0 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
110b0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
110c0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
110d0 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  fset;.  regLimit
110e0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
110f0 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
11100 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
11110 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  mit = p->pOffset
11120 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69   = 0;.  p->iLimi
11130 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  t = p->iOffset =
11140 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   0;.  pOrderBy =
11150 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
11160 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
11170 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
11180 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  the Current tabl
11190 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
111a0 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e  ALWAYS(i<pSrc->n
111b0 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Src); i++){.    
111c0 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  if( pSrc->a[i].i
111d0 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
111e0 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
111f0 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
11200 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
11210 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11220 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
11230 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
11240 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
11250 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
11260 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
11270 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
11280 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11290 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
112a0 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
112b0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
112c0 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52  _DistFifo and SR
112d0 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74  T_DistQueue dest
112e0 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b  inations to work
112f0 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20  . */.  iQueue = 
11300 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
11310 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
11320 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65  UNION ){.    eDe
11330 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
11340 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20  SRT_DistQueue : 
11350 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20  SRT_DistFifo;.  
11360 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
11370 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11380 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74  }else{.    eDest
11390 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
113a0 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69  T_Queue : SRT_Fi
113b0 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  fo;.  }.  sqlite
113c0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
113d0 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73  &destQueue, eDes
113e0 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  t, iQueue);..  /
113f0 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
11400 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20  rs for Current, 
11410 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69  Queue, and Disti
11420 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72  nct. */.  regCur
11430 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  rent = ++pParse-
11440 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
11450 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11460 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75  _OpenPseudo, iCu
11470 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e  rrent, regCurren
11480 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  t, nCol);.  if( 
11490 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
114a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
114b0 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  o = multiSelectO
114c0 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50  rderByKeyInfo(pP
114d0 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20  arse, p, 1);.   
114e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
114f0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
11500 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
11510 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
11520 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
11530 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
11540 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
11550 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65  KEYINFO);.    de
11560 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79  stQueue.pOrderBy
11570 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d   = pOrderBy;.  }
11580 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
11590 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
115a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
115b0 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a   iQueue, nCol);.
115c0 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e    }.  VdbeCommen
115d0 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62  t((v, "Queue tab
115e0 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69  le"));.  if( iDi
115f0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d  stinct ){.    p-
11600 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11610 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11620 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
11630 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69  phemeral, iDisti
11640 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  nct, 0);.    p->
11650 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
11660 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
11670 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
11680 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11690 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
116a0 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
116b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
116c0 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  ;..  /* Store th
116d0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
116e0 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20   setup-query in 
116f0 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74  Queue. */.  pSet
11700 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  up->pNext = 0;. 
11710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
11720 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
11730 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
11740 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
11750 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29   = p;.  if( rc )
11760 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63   goto end_of_rec
11770 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20  ursive_query;.. 
11780 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78   /* Find the nex
11790 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65  t row in the Que
117a0 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  ue and output th
117b0 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72  at row */.  addr
117c0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
117d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
117e0 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64  wind, iQueue, ad
117f0 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f  drBreak); VdbeCo
11800 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a  verage(v);..  /*
11810 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65   Transfer the ne
11820 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20  xt row in Queue 
11830 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20  over to Current 
11840 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11850 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp1(v, OP_Nul
11860 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b  lRow, iCurrent);
11870 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c   /* To reset col
11880 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69  umn cache */.  i
11890 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
118a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
118b0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
118c0 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  n, iQueue, pOrde
118d0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
118e0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c  gCurrent);.  }el
118f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
11900 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11910 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c  RowData, iQueue,
11920 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
11930 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
11940 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
11950 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  te, iQueue);..  
11960 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69  /* Output the si
11970 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72  ngle row in Curr
11980 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e  ent */.  addrCon
11990 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
119a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
119b0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67  odeOffset(v, reg
119c0 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
119d0 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  );.  selectInner
119e0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
119f0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72  p->pEList, iCurr
11a00 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
11a10 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
11a20 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11a30 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
11a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
11a60 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64  ro, regLimit, ad
11a70 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20  drBreak, -1);.  
11a80 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11a90 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11aa0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
11ab0 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
11ac0 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
11ad0 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
11ae0 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
11af0 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
11b00 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
11b10 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
11b20 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
11b30 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
11b40 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
11b50 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
11b60 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   0;.  sqlite3Sel
11b70 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
11b80 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73  destQueue);.  as
11b90 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
11ba0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f  =0 );.  p->pPrio
11bb0 72 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f  r = pSetup;..  /
11bc0 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74  * Keep running t
11bd0 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68  he loop until th
11be0 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79  e Queue is empty
11bf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
11c00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
11c10 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
11c20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
11c30 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
11c40 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
11c50 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
11c60 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
11c70 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
11c80 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
11c90 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
11ca0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
11cb0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
11cc0 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  mit;.  p->pOffse
11cd0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72  t = pOffset;.  r
11ce0 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
11cf0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
11d00 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  TE */../* Forwar
11d10 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
11d20 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
11d30 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
11d40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11d50 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11d60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
11d70 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
11d80 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
11d90 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
11da0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
11db0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
11dc0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
11dd0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
11de0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
11df0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11e00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
11e10 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
11e20 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
11e30 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
11e40 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
11e50 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
11e60 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
11e70 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
11e80 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
11e90 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
11ea0 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
11eb0 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
11ec0 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
11ed0 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
11ee0 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
11ef0 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
11f00 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
11f10 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
11f20 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
11f30 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
11f40 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
11f50 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
11f60 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
11f70 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
11f80 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
11f90 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
11fa0 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
11fb0 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
11fc0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
11fd0 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
11fe0 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
11ff0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
12000 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
12010 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
12020 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
12030 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
12040 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
12050 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
12060 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
12070 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
12080 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
12090 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
120a0 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
120b0 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
120d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
120e0 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
120f0 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
12100 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
12110 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
12120 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
12130 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
12140 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
12150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12160 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
12170 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
12180 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
12190 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
121a0 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
121b0 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
121c0 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
121d0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
121e0 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
121f0 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
12200 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
12210 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
12220 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
12230 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
12240 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
12250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
12260 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
12270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12280 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
12290 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
122a0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
122b0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
122c0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
122d0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
122e0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
122f0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
12300 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
12310 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
12320 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12330 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
12340 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
12350 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
12360 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
12370 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
12380 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
12390 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
123a0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
123b0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
123c0 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
123d0 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
123e0 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
123f0 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
12400 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
12410 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
12420 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
12430 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
12440 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
12450 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12460 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
12470 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12480 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  n */.#ifndef SQL
12490 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
124a0 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30  .  int iSub1 = 0
124b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
124c0 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
124d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
124e0 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub2 = 0;       
124f0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
12500 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
12510 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  /.#endif..  /* M
12520 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
12530 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
12540 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
12550 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
12560 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
12570 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
12580 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
12590 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
125a0 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
125b0 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  MIT..  */.  asse
125c0 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69  rt( p && p->pPri
125d0 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e  or );  /* Callin
125e0 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61  g function guara
125f0 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20  ntees this much 
12600 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  */.  assert( (p-
12610 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
12620 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20  ecursive)==0 || 
12630 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
12640 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
12650 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
12660 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20  e->db;.  pPrior 
12670 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  = p->pPrior;.  d
12680 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
12690 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
126a0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
126b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
126c0 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
126d0 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
126e0 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
126f0 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
12700 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
12710 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
12720 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
12730 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
12740 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
12750 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
12760 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
12770 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
12780 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
12790 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
127a0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
127b0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
127c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
127d0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
127e0 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
127f0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12800 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
12810 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
12820 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
12830 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
12840 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
12850 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
12860 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
12870 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
12880 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
12890 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
128a0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
128b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
128c0 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
128d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
128e0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
128f0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
12900 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
12910 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12920 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
12930 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
12940 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
12950 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
12960 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
12970 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
12980 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
12990 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
129a0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
129b0 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
129c0 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
129d0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
129e0 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
129f0 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
12a00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
12a10 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
12a20 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
12a30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12a40 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20  Values ){.      
12a50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
12a60 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
12a70 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
12a80 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
12a90 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65   terms");.    }e
12aa0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
12ab0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12ac0 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
12ad0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
12ae0 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20  t of %s".       
12af0 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
12b00 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
12b10 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
12b20 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
12b30 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20  p->op));.    }. 
12b40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
12b50 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
12b60 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  _end;.  }..#ifnd
12b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
12b80 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
12b90 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
12ba0 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
12bb0 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
12bc0 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
12bd0 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
12be0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
12bf0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
12c00 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
12c10 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
12c20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
12c30 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
12c40 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
12c50 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
12c60 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
12c70 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
12c80 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e   }else..  /* Gen
12c90 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
12ca0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
12cb0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
12cc0 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
12cd0 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
12ce0 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
12cf0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
12d00 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
12d10 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65  imit;.      asse
12d20 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
12d30 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72  mit );.      pPr
12d40 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
12d50 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
12d60 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
12d70 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
12d80 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
12d90 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
12da0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
12db0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
12dc0 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
12dd0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
12de0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
12df0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
12e00 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12e10 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
12e20 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
12e30 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
12e40 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
12e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
12e60 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
12e70 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
12e80 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
12e90 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
12ea0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
12eb0 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
12ec0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
12ed0 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
12ee0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
12ef0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
12f00 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
12f10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12f20 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
12f30 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f  >iLimit); VdbeCo
12f40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12f50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
12f60 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
12f70 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
12f80 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
12f90 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
12fa0 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
12fb0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
12fc0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12fd0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
12fe0 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
12ff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
13000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
13010 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
13020 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
13030 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
13040 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ior;.      p->nS
13050 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
13060 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
13070 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72        if( pPrior
13080 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20  ->pLimit.       
13090 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
130a0 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e  Integer(pPrior->
130b0 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29  pLimit, &nLimit)
130c0 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69  .       && nLimi
130d0 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  t>0 && p->nSelec
130e0 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d  tRow > (u64)nLim
130f0 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  it .      ){.   
13100 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
13110 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20  ow = nLimit;.   
13120 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
13130 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ddr ){.        s
13140 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13150 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
13160 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
13180 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
13190 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
131a0 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
131b0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
131c0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
131d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
131e0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
131f0 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20  /.      u8 op = 
13200 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
13210 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
13220 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
13230 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
13240 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
13250 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
13260 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
13270 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
13280 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
13290 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
132a0 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
132b0 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
132c0 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
132d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
132e0 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
132f0 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20  st uniondest;.. 
13300 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13310 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
13320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
13330 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
13340 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f  ON );.      prio
13350 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
13360 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
13370 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
13380 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
13390 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
133a0 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
133b0 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
133c0 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
133d0 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
133e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
133f0 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
13400 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
13410 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
13420 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
13430 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
13440 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
13450 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
13460 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
13470 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
13480 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
13490 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
134a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
134b0 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
134c0 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
134d0 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
134e0 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
134f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
13500 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
13510 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
13520 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
13530 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
13540 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13550 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
13560 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
13570 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13580 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
13590 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
135a0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
135b0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
135c0 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
135d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
135e0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
135f0 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
13600 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
13610 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
13620 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
13630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13640 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
13650 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
13660 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
13670 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
13680 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
13690 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
136a0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
136b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
136c0 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
136d0 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
136e0 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
136f0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
13700 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
13710 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
13720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13730 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
13740 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
13750 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
13760 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
13770 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13780 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
13790 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
137a0 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
137b0 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
137c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
137d0 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
137e0 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
137f0 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
13800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13810 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13820 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
13830 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
13840 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
13850 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
13860 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
13870 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
13880 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
13890 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
138a0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
138b0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
138c0 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
138d0 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
138e0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
138f0 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
13900 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13910 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13920 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13930 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
13940 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
13950 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
13960 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
13970 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
13980 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
13990 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
139a0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
139b0 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
139c0 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
139d0 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
139e0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
139f0 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
13a00 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
13a10 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
13a20 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
13a30 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
13a40 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
13a50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
13a60 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
13a70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
13a80 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
13a90 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
13aa0 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
13ab0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
13ac0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
13ad0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
13ae0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
13af0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
13b00 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
13b10 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
13b20 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
13b30 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
13b40 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
13b50 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
13b60 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
13b70 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
13b80 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
13b90 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
13ba0 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
13bb0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
13bc0 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
13bd0 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
13be0 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
13bf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
13c00 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
13c10 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
13c20 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
13c30 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
13c40 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13c50 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
13c60 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
13c70 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
13c80 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
13c90 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
13ca0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
13cb0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
13cc0 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
13cd0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
13ce0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
13cf0 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
13d00 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
13d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13d20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
13d30 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
13d40 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
13d50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13d60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
13d70 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
13d80 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
13d90 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
13da0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13db0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
13dc0 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
13dd0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
13de0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
13df0 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
13e00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13e10 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
13e20 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
13e30 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
13e40 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  t, unionTab,.   
13e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e60 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
13e70 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
13e80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13e90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13ea0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
13eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13ec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
13ed0 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
13ee0 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
13ef0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
13f00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
13f10 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
13f20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13f30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13f40 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
13f50 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
13f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f70 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
13f80 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
13f90 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
13fa0 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
13fb0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
13fc0 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
13fd0 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
13fe0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
13ff0 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
14000 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
14010 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
14020 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
14030 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
14040 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
14050 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
14060 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
14070 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
14080 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
14090 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
140a0 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
140b0 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
140c0 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
140d0 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
140e0 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
140f0 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
14100 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14110 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
14120 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14130 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
14140 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
14150 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
14160 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14170 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
14180 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
14190 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
141a0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
141b0 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
141c0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
141d0 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
141e0 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
141f0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14200 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14210 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14220 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
14230 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
14240 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
14250 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
14260 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
14270 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
14280 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
14290 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
142a0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
142b0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
142c0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
142d0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
142e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
142f0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
14300 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
14310 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
14320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
14330 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
14340 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
14350 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14360 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
14370 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
14380 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14390 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
143a0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
143b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
143c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
143d0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
143e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
143f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
14400 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
14410 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14420 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
14430 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14440 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14450 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14460 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14470 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14480 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14490 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
144a0 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
144b0 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
144c0 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
144d0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
144e0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
144f0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14510 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14520 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
14530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
14550 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
14560 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
14570 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
14580 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
14590 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
145a0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
145b0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
145c0 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
145d0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
145e0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
145f0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
14600 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
14610 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
14620 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
14630 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
14640 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14650 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
14660 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
14670 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
14680 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
14690 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
146a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
146b0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
146c0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
146d0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
146e0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
146f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14700 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
14710 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
14720 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
14730 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
14740 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
14750 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
14760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14770 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
14780 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14790 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
147a0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
147b0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
147c0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
147d0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
147e0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
147f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14800 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
14810 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
14820 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14830 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
14840 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
14850 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
14860 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14870 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
14880 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
14890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
148a0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
148b0 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
148c0 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56 64  Cont, r1, 0); Vd
148d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
148e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
148f0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14900 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65  e, r1);.      se
14910 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
14920 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
14930 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20  st, tab1,.      
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
14960 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
14970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
14980 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
14990 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
149a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
149b0 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
149c0 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
149d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
149e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
149f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
14a00 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
14a10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14a20 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
14a30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14a50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
14a60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14a70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
14a80 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
14a90 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
14aa0 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
14ab0 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
14ac0 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
14ad0 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
14ae0 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
14af0 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
14b00 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
14b10 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
14b20 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
14b30 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
14b40 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
14b50 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
14b60 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
14b70 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
14b80 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
14b90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14ba0 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
14bb0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
14bc0 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
14bd0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
14be0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
14bf0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
14c00 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
14c10 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
14c20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
14c30 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
14c40 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
14c50 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
14c60 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
14c70 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
14c80 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14cb0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
14cc0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
14cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14ce0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
14cf0 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
14d00 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
14d10 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
14d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
14d30 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
14d40 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
14d50 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
14d60 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
14d70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
14d80 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
14d90 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
14da0 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
14db0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
14dc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14dd0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
14de0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
14df0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
14e00 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
14e10 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
14e20 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
14e30 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
14e40 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
14e50 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
14e60 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
14e70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14e80 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
14e90 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
14ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
14eb0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
14ec0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
14ed0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
14ee0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
14ef0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
14f00 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
14f10 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
14f20 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
14f30 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
14f40 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
14f50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14f60 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
14f70 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
14f80 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
14f90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
14fa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
14fb0 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
14fc0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
14fd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
14fe0 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
14ff0 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
15000 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
15010 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
15020 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
15030 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
15040 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
15050 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
15060 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
15070 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
15080 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
15090 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
150a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
150b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
150c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
150d0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
150e0 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
150f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15100 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
15110 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
15120 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
15130 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
15140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15150 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
15160 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
15170 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
15180 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
15190 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
151a0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
151b0 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
151c0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
151d0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
151e0 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
151f0 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
15200 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
15210 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
15220 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
15230 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
15240 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
15250 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
15260 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
15270 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
15280 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
15290 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
152a0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
152b0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
152c0 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
152d0 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
152e0 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
152f0 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
15300 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
15310 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
15320 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
15330 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
15340 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
15350 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
15360 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
15370 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
15380 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
15390 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
153a0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
153b0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
153c0 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
153d0 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
153e0 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
153f0 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
15400 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
15410 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
15420 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
15430 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
15440 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
15450 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
15460 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
15470 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
15480 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
15490 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
154a0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
154b0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
154c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
154d0 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
154e0 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
154f0 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
15500 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
15510 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
15520 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
15530 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
15540 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15550 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15560 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15570 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15580 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
15590 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
155a0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
155b0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
155c0 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
155d0 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
155e0 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
155f0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
15600 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
15610 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
15620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15630 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
15640 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
15650 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
15660 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
15670 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
15680 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
15690 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
156a0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
156b0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
156c0 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
156d0 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
156e0 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
156f0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
15700 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
15710 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
15720 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
15730 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
15740 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
15750 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
15760 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15770 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
15780 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
15790 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
157a0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
157b0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
157c0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
157d0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
157e0 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
157f0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
15800 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
15810 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15820 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
15830 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
15840 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  e(v);.    j2 = s
15850 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15860 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
15870 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
15880 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
15890 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
158c0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
158d0 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
158e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
158f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
15900 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
15910 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65  nue, j2+2); Vdbe
15920 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
15930 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15940 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
15950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15960 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
15970 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
15980 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
15990 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
159a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
159b0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
159c0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
159d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
159e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
159f0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
15a00 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
15a10 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
15a20 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
15a30 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
15a40 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
15a50 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
15a60 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
15a70 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
15a80 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
15a90 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
15aa0 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
15ab0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
15ac0 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
15ad0 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
15ae0 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
15af0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
15b00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15b10 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
15b20 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
15b30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15b40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
15b50 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
15b60 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
15b70 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
15b80 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
15b90 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
15ba0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15bb0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
15bc0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
15bd0 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
15be0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15bf0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
15c00 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
15c10 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
15c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15c30 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
15c40 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
15c50 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
15c60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
15c70 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
15c80 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
15c90 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15ca0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
15cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
15cc0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
15cd0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
15ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
15cf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15d00 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
15d10 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
15d20 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
15d30 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
15d40 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
15d50 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
15d60 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
15d70 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
15d80 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
15d90 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
15da0 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
15db0 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
15dc0 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
15dd0 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
15de0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
15df0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15e00 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
15e10 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
15e20 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
15e30 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
15e40 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
15e50 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
15e60 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
15e70 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15e80 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15e90 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
15ea0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15eb0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
15ec0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
15ed0 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
15ee0 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
15ef0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
15f00 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
15f10 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
15f20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15f30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15f40 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
15f50 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
15f60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
15f70 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15f80 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
15f90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
15fa0 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
15fb0 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
15fc0 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
15fd0 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
15fe0 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
15ff0 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
16000 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
16010 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
16020 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
16030 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16040 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16050 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
16060 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
16070 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
16080 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
16090 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
160a0 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
160b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
160c0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
160d0 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
160e0 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
160f0 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
16100 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
16110 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
16120 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
16130 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
16140 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
16150 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
16160 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
16170 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
16180 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
16190 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
161a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
161b0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
161c0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
161d0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
161e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
161f0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
16200 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
16210 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
16220 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
16230 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
16240 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
16250 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
16260 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
16270 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
16280 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
16290 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
162a0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
162b0 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
162c0 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
162d0 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
162e0 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
162f0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
16300 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
16310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
16320 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
16330 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
16340 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
16350 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
16360 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
16370 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
16380 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
16390 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
163a0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
163b0 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
163c0 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
163d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163e0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
163f0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16400 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16410 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
16420 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
16430 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
16440 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
16450 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
16460 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
16470 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
16480 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
16490 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
164a0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
164b0 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
164c0 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
164d0 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
164e0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
164f0 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
16500 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
16510 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
16520 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
16530 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
16540 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
16550 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
16560 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
16570 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
16580 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
16590 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
165a0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
165b0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
165c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
165d0 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
165e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
165f0 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
16600 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
16610 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16620 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
16630 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
16640 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
16650 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
16660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
16680 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
16690 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
166a0 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
166b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
166c0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
166d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
166e0 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
166f0 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
16700 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
16710 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
16720 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
16730 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
16740 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
16750 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
16760 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
16770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16780 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
16790 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
167a0 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
167b0 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
167c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
167d0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
167e0 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
167f0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
16800 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
16810 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
16820 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
16830 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
16840 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
16850 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
16860 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
16870 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
16880 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
16890 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
168a0 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
168b0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
168c0 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
168d0 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
168e0 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
168f0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
16900 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
16910 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
16920 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
16930 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
16940 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
16950 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
16960 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
16970 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
16980 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
16990 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
169a0 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
169b0 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
169c0 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
169d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
169e0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
169f0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
16a00 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
16a10 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
16a20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
16a30 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
16a40 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
16a50 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
16a60 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
16a70 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
16a80 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
16aa0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
16ab0 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
16ac0 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
16ad0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
16ae0 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
16af0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
16b00 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
16b10 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
16b20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
16b30 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
16b40 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
16b50 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
16b60 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
16b70 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
16b80 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
16b90 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
16ba0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
16bb0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
16bc0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
16bd0 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
16be0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
16bf0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
16c00 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
16c10 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
16c20 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
16c30 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
16c40 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
16c50 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
16c60 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
16c70 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
16c80 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
16c90 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
16ca0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
16cb0 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
16cc0 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
16cd0 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
16ce0 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
16cf0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
16d00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
16d10 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
16d20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
16d30 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
16d40 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
16d50 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
16d60 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
16d70 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
16d80 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
16d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
16da0 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
16db0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
16dc0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
16dd0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
16de0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
16df0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
16e00 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
16e10 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
16e20 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
16e30 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
16e40 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
16e50 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
16e60 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
16e70 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
16e80 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
16e90 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
16ea0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
16eb0 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
16ec0 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
16ed0 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
16ee0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
16ef0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
16f00 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
16f10 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
16f20 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
16f30 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
16f40 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
16f50 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
16f60 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
16f70 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
16f80 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
16f90 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
16fa0 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
16fb0 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
16fc0 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
16fd0 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
16fe0 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
16ff0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
17000 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
17010 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
17020 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
17030 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
17040 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
17050 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
17060 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
17070 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
17080 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
17090 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
170a0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
170b0 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
170c0 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
170d0 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
170e0 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
170f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
17100 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
17110 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
17120 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
17130 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
17140 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
17150 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
17160 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
17170 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
17180 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
17190 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
171a0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
171b0 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
171c0 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
171d0 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
171e0 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
171f0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
17200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17210 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
17220 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
17230 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
17240 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
17250 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
17260 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
17270 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
17280 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
17290 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
172a0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
172b0 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
172c0 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
172d0 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
172e0 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
172f0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
17300 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
17310 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
17320 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
17330 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
17340 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
17350 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
17360 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
17370 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
17380 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
17390 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
173a0 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
173b0 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
173c0 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
173d0 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
173e0 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
173f0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
17400 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
17410 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
17420 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
17430 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
17440 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
17450 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
17460 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
17470 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
17480 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
17490 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
174a0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
174b0 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
174c0 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
174d0 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
174e0 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
174f0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
17500 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
17510 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
17520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
17530 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
17540 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
17550 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
17560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17570 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17580 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
17590 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
175a0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
175b0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
175c0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
175d0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
175e0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
175f0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
17600 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
17610 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
17620 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
17630 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
17640 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
17650 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
17660 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
17670 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
17680 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
17690 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
176a0 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
176b0 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
176c0 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
176d0 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
176e0 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
176f0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17700 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
17710 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17720 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
17730 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
17740 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17750 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
17760 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
17770 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
17780 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17790 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
177a0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
177b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
177c0 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
177d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
177e0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
177f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17800 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
17810 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17820 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
17830 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
17840 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
17850 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
17860 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
17870 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
17880 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
17890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
178a0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
178b0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
178c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
178d0 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
178e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
178f0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
17900 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
17910 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
17920 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
17930 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
17940 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
17950 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
17960 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
17970 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
17980 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
17990 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
179a0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
179b0 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
179c0 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
179d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
179e0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
179f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17a00 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17a10 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
17a20 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17a30 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
17a40 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
17a50 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
17a60 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17a70 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
17a80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
17a90 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
17aa0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
17ab0 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
17ac0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
17ad0 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
17ae0 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
17af0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
17b00 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
17b10 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
17b20 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
17b30 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
17b40 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
17b50 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
17b60 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
17b70 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
17b80 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
17b90 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
17ba0 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
17bb0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
17bc0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
17bd0 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
17be0 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
17bf0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
17c00 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
17c10 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
17c20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
17c30 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
17c40 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
17c50 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
17c60 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
17c70 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
17c80 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
17c90 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
17ca0 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
17cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
17cc0 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
17cd0 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
17ce0 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
17cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17d00 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
17d10 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
17d20 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
17d30 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
17d40 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
17d50 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
17d60 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
17d70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
17d80 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
17d90 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
17da0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
17db0 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
17dc0 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
17dd0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
17de0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
17df0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
17e00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
17e10 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
17e20 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
17e30 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
17e40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17e50 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
17e60 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
17e70 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
17e80 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
17e90 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
17ea0 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
17eb0 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
17ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17ed0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
17ee0 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
17ef0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
17f00 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
17f10 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
17f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
17f30 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
17f40 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
17f50 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
17f60 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
17f70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
17f80 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
17f90 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
17fa0 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
17fb0 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
17fc0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
17fd0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
17fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
17ff0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
18000 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
18010 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
18020 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
18030 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
18040 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18050 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
18060 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18070 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
18080 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
18090 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
180a0 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
180b0 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
180c0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
180d0 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
180e0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
180f0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
18100 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
18110 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
18120 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
18130 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
18140 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
18150 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
18160 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
18170 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
18180 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18190 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
181a0 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
181b0 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
181c0 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
181d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
181e0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
181f0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
18200 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
18210 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
18220 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
18230 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
18240 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
18250 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18260 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
18270 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
18280 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
18290 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
182a0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
182b0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
182c0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
182d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
182e0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
182f0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
18300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18310 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
18320 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
18330 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
18340 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
18350 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
18360 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
18370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18380 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
18390 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
183a0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
183b0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
183c0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
183d0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
183e0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
183f0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
18400 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
18410 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
18420 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
18430 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
18440 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
18450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18460 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
18470 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
18480 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
18490 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
184a0 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
184b0 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
184c0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
184d0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
184e0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
184f0 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
18500 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
18510 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
18520 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
18530 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
18540 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
18550 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
18560 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
18570 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
18580 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
18590 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
185a0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
185b0 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
185c0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
185d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
185e0 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
185f0 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
18600 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
18610 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
18620 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
18630 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
18640 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
18650 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
18660 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
18670 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
18680 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
18690 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49  .          && pI
186a0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
186b0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
186c0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
186d0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
186e0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
186f0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
18700 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
18710 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
18720 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
18730 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
18740 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
18750 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
18760 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
18770 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
18780 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
18790 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
187a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
187b0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
187c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
187d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
187e0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
187f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
18800 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
18810 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
18820 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
18830 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
18840 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
18850 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
18860 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
18870 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
18880 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
18890 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
188a0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
188b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
188c0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
188d0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
188e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
188f0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
18900 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
18910 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
18920 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
18930 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
18940 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
18950 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
18960 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
18970 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
18980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18990 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
189a0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
189b0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
189c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
189d0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
189e0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
189f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
18a00 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
18a10 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
18a20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18a30 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
18a40 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
18a50 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
18a60 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
18a70 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
18a80 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
18a90 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
18aa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18ab0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
18ac0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
18ad0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
18ae0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
18af0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
18b00 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
18b10 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
18b20 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
18b30 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
18b40 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
18b50 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
18b60 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
18b70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
18b80 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
18b90 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
18ba0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
18bb0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
18bc0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
18bd0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
18be0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
18bf0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
18c00 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
18c10 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
18c20 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
18c30 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
18c40 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
18c50 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
18c60 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
18c70 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
18c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18c90 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
18ca0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
18cb0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ce0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
18cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18d00 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
18d10 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
18d20 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
18d30 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
18d40 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
18d50 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
18d60 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
18d70 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
18d80 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
18d90 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
18da0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
18db0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
18dc0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
18dd0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
18de0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
18df0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
18e00 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
18e10 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
18e20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
18e30 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
18e40 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
18e50 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
18e60 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
18e70 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
18e80 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
18e90 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
18ea0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
18eb0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
18ec0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
18ed0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18ee0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
18ef0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
18f00 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
18f10 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
18f20 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
18f30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18f40 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
18f50 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
18f60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18f70 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
18f80 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72  egAddrA, 0, addr
18f90 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65  SelectA);.  Vdbe
18fa0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66  Comment((v, "lef
18fb0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70  t SELECT"));.  p
18fc0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
18fd0 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70  regLimitA;.  exp
18fe0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
18ff0 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
19000 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
19010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
19020 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
19030 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  estA);.  sqlite3
19040 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
19050 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
19060 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
19070 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
19080 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65  v, j1);..  /* Ge
19090 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
190a0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
190b0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
190c0 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
190d0 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
190e0 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
190f0 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
19100 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
19110 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31  ddr(v) + 1;.  j1
19120 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19130 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
19140 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
19150 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63  rB, 0, addrSelec
19160 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  tB);.  VdbeComme
19170 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45  nt((v, "right SE
19180 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
19190 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
191a0 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
191b0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
191c0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
191d0 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
191e0 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78  fset = 0;  .  ex
191f0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
19200 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
19210 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
19220 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
19230 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
19240 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
19250 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
19260 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
19270 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
19280 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
19290 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
192a0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
192b0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
192c0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
192d0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
192e0 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
192f0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
19300 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
19310 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
19320 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
19330 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
19340 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
19350 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
19360 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
19370 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
19380 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
193a0 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
193b0 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
193c0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
193d0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
193e0 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
193f0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19400 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
19410 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19420 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
19430 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
19440 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
19450 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
19460 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
19470 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
19480 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
19490 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
194a0 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
194b0 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
194c0 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
194d0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
194e0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
19510 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19530 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
19540 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20  abelEnd);.  }.  
19550 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
19560 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20  ref(pKeyDup);.. 
19570 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19580 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
19590 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
195a0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a  s from select A.
195b0 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
195c0 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
195d0 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d   in select B rem
195e0 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
195f0 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c   op==TK_EXCEPT |
19600 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  | op==TK_INTERSE
19610 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
19620 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66  fA_noB = addrEof
19630 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20  A = labelEnd;.  
19640 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
19650 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
19660 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69   "eof-A subrouti
19670 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
19680 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
19690 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
196a0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
196b0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64  drOutB);.    add
196c0 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69  rEofA_noB = sqli
196d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
196e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
196f0 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drB, labelEnd);.
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
19730 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
19740 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19750 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
19760 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65  ofA);.    p->nSe
19770 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
19780 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
19790 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
197a0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
197b0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
197c0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
197d0 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct B.  ** are ex
197e0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
197f0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
19800 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  A remains..  */.
19810 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54    if( op==TK_INT
19820 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
19830 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66  drEofB = addrEof
19840 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  A;.    if( p->nS
19850 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f  electRow > pPrio
19860 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
19870 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
19880 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
19890 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  ow;.  }else{  . 
198a0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
198b0 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75  nt((v, "eof-B su
198c0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
198d0 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69   addrEofB = sqli
198e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
198f0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
19900 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
19910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19920 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19930 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65  , regAddrA, labe
19940 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  lEnd); VdbeCover
19950 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19970 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19980 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rEofB);.  }..  /
19990 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
199a0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
199b0 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20  se of A<B.  */. 
199c0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
199d0 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62  ((v, "A-lt-B sub
199e0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
199f0 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33  drAltB = sqlite3
19a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19a10 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
19a20 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71   addrOutA);.  sq
19a30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19a40 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19a50 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
19a60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
19a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
19a80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
19a90 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
19aa0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19ab0 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
19ac0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
19ad0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19ae0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
19af0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
19b00 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
19b10 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
19b20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
19b30 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
19b40 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
19b50 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
19b60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
19b70 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
19b80 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
19b90 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
19ba0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19bb0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19bc0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
19bd0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19be0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19bf0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
19c00 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d   labelCmpr);.  }
19c10 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19c20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
19c30 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20  he case of A>B. 
19c40 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
19c50 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d  mment((v, "A-gt-
19c60 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
19c70 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71  .  addrAgtB = sq
19c80 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
19c90 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f  Addr(v);.  if( o
19ca0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
19cb0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
19cc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19cd0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
19ce0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
19cf0 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  B);.  }.  sqlite
19d00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d10 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
19d20 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
19d30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19d50 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19d60 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
19d70 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
19d80 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
19d90 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
19da0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
19db0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
19dc0 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
19dd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
19de0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
19df0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
19e00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19e20 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
19e30 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
19e40 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
19e50 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
19e60 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
19e70 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
19e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
19e90 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
19ea0 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
19eb0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19ec0 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
19ed0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
19ee0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
19ef0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
19f00 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19f10 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
19f20 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
19f30 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
19f60 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
19f70 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
19f80 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19f90 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
19fa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19fb0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
19fc0 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
19fd0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
19fe0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
19ff0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1a000 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1a010 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1a020 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1a030 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1a040 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1a050 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1a060 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
1a070 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
1a080 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
1a090 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1a0a0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
1a0b0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
1a0c0 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
1a0d0 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
1a0e0 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
1a0f0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
1a100 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
1a110 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
1a120 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
1a130 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
1a140 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1a150 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1a160 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1a170 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1a180 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1a190 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1a1a0 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1a1b0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1a1c0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1a1d0 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1a1e0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1a1f0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1a200 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1a210 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1a220 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1a230 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1a240 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1a250 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1a260 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  /.  explainCompo
1a270 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
1a280 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
1a290 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
1a2a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1a2b0 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1a2c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1a2d0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1a2e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1a2f0 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20  IEW)./* Forward 
1a300 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a  Declarations */.
1a310 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1a320 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65  tExprList(sqlite
1a330 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69  3*, ExprList*, i
1a340 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  nt, ExprList*);.
1a350 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1a360 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a  tSelect(sqlite3*
1a370 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c  , Select *, int,
1a380 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f   ExprList *);../
1a390 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1a3a0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1a3b0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1a3c0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1a3d0 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1a3e0 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1a3f0 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1a400 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1a410 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1a420 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1a430 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1a440 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1a450 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1a460 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1a470 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1a480 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1a490 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1a4a0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1a4b0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1a4c0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1a4d0 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1a4e0 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1a4f0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1a500 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1a510 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1a520 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1a530 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1a540 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1a550 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1a560 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
1a570 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1a580 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1a590 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1a5a0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1a5b0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1a5c0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1a5d0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1a5e0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1a5f0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1a600 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74  bstExpr(.  sqlit
1a610 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1a620 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1a630 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63  errors to this c
1a640 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
1a650 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1a660 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68     /* Expr in wh
1a670 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ich substitution
1a680 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74   occurs */.  int
1a690 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1a6a0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1a6b0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1a6c0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1a6d0 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75  t    /* Substitu
1a6e0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  te expressions *
1a6f0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
1a700 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1a710 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
1a720 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45  =TK_COLUMN && pE
1a730 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  xpr->iTable==iTa
1a740 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1a750 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1a760 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1a770 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1a780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1a790 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1a7a0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
1a7b0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1a7c0 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  lumn<pEList->nEx
1a7d0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1a7e0 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1a7f0 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1a800 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1a810 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1a820 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  xprDup(db, pELis
1a830 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  t->a[pExpr->iCol
1a840 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  umn].pExpr, 0);.
1a850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a860 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1a870 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20  r);.      pExpr 
1a880 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = pNew;.    }.  
1a890 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72  }else{.    pExpr
1a8a0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1a8b0 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
1a8c0 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
1a8d0 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72  List);.    pExpr
1a8e0 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74  ->pRight = subst
1a8f0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
1a900 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
1a910 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1a920 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1a930 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
1a940 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
1a950 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1a960 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1a970 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1a980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a990 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1a9a0 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  (db, pExpr->x.pL
1a9b0 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
1a9c0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1a9d0 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a    return pExpr;.
1a9e0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1a9f0 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73  bstExprList(.  s
1aa00 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1aa10 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1aa20 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1aa30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1aa40 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69  pList,     /* Li
1aa50 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1aa60 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1aa70 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20  substitutes */. 
1aa80 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1aa90 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1aaa0 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
1aab0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1aac0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
1aad0 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
1aae0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1aaf0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1ab00 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1ab10 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1ab20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1ab30 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1ab40 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1ab50 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1ab60 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ab70 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1ab80 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1ab90 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1aba0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
1abb0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
1abc0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
1abd0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1abe0 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
1abf0 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
1ac00 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
1ac10 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
1ac20 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1ac30 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
1ac40 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
1ac50 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
1ac60 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
1ac70 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  ues */.){.  SrcL
1ac80 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1ac90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1aca0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1acb0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1acc0 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72  urn;.  substExpr
1acd0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69  List(db, p->pELi
1ace0 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
1acf0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
1ad00 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f  List(db, p->pGro
1ad10 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  upBy, iTable, pE
1ad20 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
1ad30 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f  prList(db, p->pO
1ad40 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20  rderBy, iTable, 
1ad50 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48  pEList);.  p->pH
1ad60 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1ad70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
1ad80 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1ad90 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  );.  p->pWhere =
1ada0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1adb0 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65  ->pWhere, iTable
1adc0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
1add0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e  stSelect(db, p->
1ade0 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20  pPrior, iTable, 
1adf0 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20  pEList);.  pSrc 
1ae00 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
1ae10 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a  ert( pSrc );  /*
1ae20 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43   Even for (SELEC
1ae30 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53  T 1) we have: pS
1ae40 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e  rc!=0 but pSrc->
1ae50 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28  nSrc==0 */.  if(
1ae60 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b   ALWAYS(pSrc) ){
1ae70 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  .    for(i=pSrc-
1ae80 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72  >nSrc, pItem=pSr
1ae90 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  c->a; i>0; i--, 
1aea0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1aeb0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
1aec0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1aed0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1aee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
1aef0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
1af00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1af10 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1af20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1af30 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  EW) */..#if !def
1af40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1af50 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1af60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1af70 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54  IT_VIEW)./*.** T
1af80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
1af90 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
1afa0 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20  subqueries as a 
1afb0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69  performance opti
1afc0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  mization..** Thi
1afd0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1afe0 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20  s 1 if it makes 
1aff0 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66  changes and 0 if
1b000 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f   no flattening o
1b010 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ccurs..**.** To 
1b020 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63  understand the c
1b030 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65  oncept of flatte
1b040 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74  ning, consider t
1b050 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1b060 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1b070 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28   SELECT a FROM (
1b080 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1b090 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1b0a0 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a  100) WHERE a>5.*
1b0b0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
1b0c0 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e   way of implemen
1b0d0 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20  ting this query 
1b0e0 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  is to execute th
1b0f0 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69  e.** subquery fi
1b100 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68  rst and store th
1b110 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  e results in a t
1b120 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1b130 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20  then.** run the 
1b140 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74  outer query on t
1b150 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61  hat temporary ta
1b160 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69  ble.  This requi
1b170 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65  res two.** passe
1b180 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e  s over the data.
1b190 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62    Furthermore, b
1b1a0 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f  ecause the tempo
1b1b0 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61  rary table.** ha
1b1c0 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68  s no indices, th
1b1d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
1b1e0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1b1f0 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f  y cannot be.** o
1b200 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20  ptimized..**.** 
1b210 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1b220 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65  empts to rewrite
1b230 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73   queries such as
1b240 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a   the above into.
1b250 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74  ** a single flat
1b260 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68   select, like th
1b270 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  is:.**.**     SE
1b280 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1b290 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1b2a0 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  0 AND a>5.**.** 
1b2b0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1b2c0 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70  ed for this simp
1b2d0 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  lification gives
1b2e0 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1b2f0 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
1b300 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
1b310 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
1b320 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
1b330 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
1b340 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
1b350 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
1b360 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
1b370 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
1b380 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
1b390 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
1b3a0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
1b3b0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1b3c0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
1b3d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1b3e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1b3f0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1b400 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
1b410 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
1b420 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1b430 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1b440 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1b450 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1b460 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
1b470 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
1b480 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1b490 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1b4a0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
1b4b0 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
1b4c0 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
1b4d0 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
1b4e0 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
1b4f0 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
1b500 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
1b510 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1b520 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1b530 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1b540 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1b550 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1b560 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1b570 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1b580 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1b590 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1b5a0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1b5b0 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1b5c0 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1b5d0 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1b5e0 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1b5f0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1b600 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
1b610 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b620 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
1b630 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b640 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
1b650 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
1b660 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
1b670 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
1b680 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
1b690 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
1b6a0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
1b6b0 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
1b6c0 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
1b6d0 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
1b6e0 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1b6f0 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1b700 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1b710 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1b720 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1b730 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1b740 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1b750 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1b760 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b770 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1b780 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1b790 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1b7a0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1b7b0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1b7c0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1b7d0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1b7e0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1b7f0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1b800 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1b810 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1b820 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1b830 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1b840 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1b850 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1b860 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1b870 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1b880 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1b890 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1b8a0 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1b8b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1b8c0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1b8d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1b8e0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
1b8f0 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a      use LIMIT.".
1b900 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
1b910 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1b920 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1b930 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
1b940 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
1b950 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f  .**.**  (**)  No
1b960 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
1b970 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
1b980 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
1b990 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
1b9a0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
1b9b0 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
1b9c0 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
1b9d0 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
1b9e0 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
1b9f0 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
1ba00 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1ba10 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1ba20 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1ba30 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1ba40 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a  se OFFSET..**.**
1ba50 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65    (15)  The oute
1ba60 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70  r query is not p
1ba70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
1ba80 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a  d select or the.
1ba90 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65  **        subque
1baa0 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ry does not have
1bab0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e   a LIMIT clause.
1bac0 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20  .**        (See 
1bad0 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64  ticket #2339 and
1bae0 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31   ticket [02a8e81
1baf0 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  d44])..**.**  (1
1bb00 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  6)  The outer qu
1bb10 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1bb20 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73  gregate or the s
1bb30 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20  ubquery does.** 
1bb40 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61         not conta
1bb50 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  in ORDER BY.  (T
1bb60 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1bb70 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1bb80 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1bb90 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1bba0 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1bbb0 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1bbc0 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1bbd0 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  The sub-query is
1bbe0 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   not a compound 
1bbf0 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73  select, or it is
1bc00 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a   a UNION ALL .**
1bc10 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1bc20 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20   clause made up 
1bc30 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d  entirely of non-
1bc40 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1bc50 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20  s, and .**      
1bc60 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65    the parent que
1bc70 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ry:.**.**       
1bc80 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65     * is not itse
1bc90 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  lf part of a com
1bca0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a  pound select,.**
1bcb0 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1bcc0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1bcd0 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72  or DISTINCT quer
1bce0 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  y, and.**       
1bcf0 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f     * is not a jo
1bd00 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  in.**.**        
1bd10 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73  The parent and s
1bd20 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e  ub-query may con
1bd30 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73  tain WHERE claus
1bd40 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a  es. Subject to.*
1bd50 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28  *        rules (
1bd60 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31  11), (13) and (1
1bd70 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73  4), they may als
1bd80 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  o contain ORDER 
1bd90 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49  BY,.**        LI
1bda0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
1bdb0 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62  lauses.  The sub
1bdc0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65  query cannot use
1bdd0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1bde0 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1bdf0 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
1be00 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c  N ALL because al
1be10 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70  l the other comp
1be20 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1be30 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e  perators have an
1be40 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43   implied DISTINC
1be50 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c  T which is disal
1be60 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  lowed by.**     
1be70 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28     restriction (
1be80 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  4)..**.**       
1be90 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70   Also, each comp
1bea0 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62  onent of the sub
1beb0 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75  -query must retu
1bec0 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  rn the same numb
1bed0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20  er.**        of 
1bee0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20  result columns. 
1bef0 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79  This is actually
1bf00 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66   a requirement f
1bf10 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  or any compound.
1bf20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1bf30 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20   statement, but 
1bf40 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72  all the code her
1bf50 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  e does is make s
1bf60 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20  ure that no.**  
1bf70 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65        such (ille
1bf80 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69  gal) sub-query i
1bf90 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65  s flattened. The
1bfa0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74   caller will det
1bfb0 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ect the.**      
1bfc0 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61    syntax error a
1bfd0 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61  nd return a deta
1bfe0 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  iled message..**
1bff0 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
1c000 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1c010 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1c020 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
1c030 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
1c040 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
1c050 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1c060 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
1c070 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
1c080 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
1c090 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1c0a0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
1c0b0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c0c0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c0d0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c0e0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
1c0f0 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
1c100 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
1c110 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75   (20)  If the su
1c120 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1c130 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
1c140 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75  en it must not u
1c150 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20  se.**        an 
1c160 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
1c170 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20    Ticket #3773. 
1c180 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20   We could relax 
1c190 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a  this constraint.
1c1a0 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68  **        somewh
1c1b0 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61  at by saying tha
1c1c0 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  t the terms of t
1c1d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1c1e0 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20  se must.**      
1c1f0 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f    appear as unmo
1c200 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f  dified result co
1c210 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74  lumns in the out
1c220 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77  er query.  But w
1c230 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  e.**        have
1c240 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74   other optimizat
1c250 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20  ions in mind to 
1c260 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63  deal with that c
1c270 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29  ase..**.**  (21)
1c280 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c290 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c2a0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1c2b0 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20  uery is not.**  
1c2c0 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20        DISTINCT. 
1c2d0 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35   (See ticket [75
1c2e0 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a  2e1646fc])..**.*
1c2f0 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62  *  (22)  The sub
1c300 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72  query is not a r
1c310 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
1c320 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70  .**  (23)  The p
1c330 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72  arent is not a r
1c340 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72  ecursive CTE, or
1c350 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c360 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20  s not a.**      
1c370 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79    compound query
1c380 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  . This restricti
1c390 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72  on is because tr
1c3a0 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a  ansforming the.*
1c3b0 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20  *        parent 
1c3c0 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  to a compound qu
1c3d0 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65  ery confuses the
1c3e0 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c   code that handl
1c3f0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63  es.**        rec
1c400 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69  ursive queries i
1c410 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e  n multiSelect().
1c420 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68  .**.**  (24)  Th
1c430 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1c440 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74  t an aggregate t
1c450 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69  hat uses the bui
1c460 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a  lt-in min() or .
1c470 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78  **        or max
1c480 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28  () functions.  (
1c490 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73  Without this res
1c4a0 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72  triction, a quer
1c4b0 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20  y like:.**      
1c4c0 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d    "SELECT x FROM
1c4d0 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c   (SELECT max(y),
1c4e0 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75   x FROM t1)" wou
1c4f0 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  ld not necessari
1c500 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74  ly.**        ret
1c510 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20  urn the value X 
1c520 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20  for which Y was 
1c530 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a  maximal.).**.**.
1c540 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1c550 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1c560 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1c570 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1c580 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1c590 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1c5a0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1c5b0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1c5c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1c5d0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1c5e0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1c5f0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1c600 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1c610 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1c620 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1c630 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1c640 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1c650 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1c660 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1c670 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1c680 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1c690 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1c6a0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1c6b0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1c6c0 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1c6d0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1c6e0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1c6f0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1c700 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1c710 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1c720 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1c730 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1c740 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1c750 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1c760 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1c770 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c780 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1c790 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c7a0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1c7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1c7c0 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1c7d0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1c7e0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1c7f0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1c800 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1c810 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1c820 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c830 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1c840 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1c850 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1c860 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1c870 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1c880 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1c890 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1c8a0 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1c8b0 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1c8c0 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1c8d0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1c8e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1c8f0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1c900 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1c910 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1c920 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1c930 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1c940 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1c950 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1c960 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1c970 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c980 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c990 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1c9a0 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1c9b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1c9c0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1c9d0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1c9e0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1c9f0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1ca00 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1ca10 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1ca20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1ca30 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1ca40 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1ca50 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1ca60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1ca70 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1ca80 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1ca90 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cab0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1cac0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1cad0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1cae0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1caf0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1cb00 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1cb10 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1cb20 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1cb30 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1cb40 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1cb50 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1cb60 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1cb70 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1cb80 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1cb90 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1cba0 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1cbb0 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1cbc0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1cbd0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1cbe0 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1cbf0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1cc00 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1cc10 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1cc20 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1cc30 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1cc40 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1cc50 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1cc60 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1cc70 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1cc80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1cc90 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1cca0 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
1ccb0 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
1ccc0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1cce0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1ccf0 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
1cd00 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
1cd10 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1cd20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
1cd30 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
1cd40 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
1cd50 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1cd60 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1cd70 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1cd80 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1cd90 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1cda0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1cdb0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1cdc0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1cdd0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1cde0 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1cdf0 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1ce00 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1ce10 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1ce20 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1ce30 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1ce40 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1ce50 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1ce60 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1ce70 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1ce80 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1ce90 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1cea0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1ceb0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1cec0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1ced0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1cee0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1cef0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1cf00 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1cf10 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1cf20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1cf50 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1cf60 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1cf70 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1cf80 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1cf90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1cfd0 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1cfe0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1cff0 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1d000 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d020 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1d030 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1d040 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1d050 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1d060 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1d070 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1d080 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1d090 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1d0a0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1d0b0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1d0c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1d0d0 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1d0e0 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1d0f0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1d100 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1d110 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1d120 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1d130 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1d140 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1d150 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1d160 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1d170 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1d180 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d1c0 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1d1d0 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1d1e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1d1f0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d210 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1d220 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d230 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1d240 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1d250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d260 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1d270 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d280 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1d290 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1d2a0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1d2b0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d2c0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d2d0 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65  (21) */.  }.  te
1d2e0 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1d2f0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1d300 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63  rsive );.  testc
1d310 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1d320 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41  ags & SF_MinMaxA
1d330 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  gg );.  if( pSub
1d340 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1d350 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f 4d 69  _Recursive|SF_Mi
1d360 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20 20 20  nMaxAgg) ){.    
1d370 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1d380 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 61  trictions (22) a
1d390 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20  nd (24) */.  }. 
1d3a0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1d3b0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1d3c0 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  ) && pSub->pPrio
1d3d0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1d3e0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1d3f0 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (23) */.  }.. 
1d400 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
1d410 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
1d420 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
1d430 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1d440 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
1d450 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1d460 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
1d470 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
1d480 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
1d490 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
1d4a0 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
1d4b0 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
1d4c0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1d4d0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1d4e0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1d4f0 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1d500 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1d510 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1d520 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1d530 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1d540 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1d550 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1d560 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1d570 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1d580 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
1d590 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1d5a0 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
1d5b0 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
1d5c0 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1d5d0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1d5e0 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
1d5f0 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
1d600 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1d610 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
1d620 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
1d630 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1d640 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
1d650 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1d660 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1d670 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
1d680 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1d690 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
1d6a0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1d6b0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1d6c0 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1d6d0 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1d6e0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1d6f0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
1d700 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
1d710 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
1d720 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
1d730 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
1d740 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
1d750 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
1d760 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
1d770 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
1d780 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
1d790 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
1d7a0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
1d7b0 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
1d7c0 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
1d7d0 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
1d7e0 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
1d7f0 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1d800 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
1d810 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
1d820 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
1d830 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
1d840 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
1d850 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1d860 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1d870 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
1d880 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
1d890 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1d8a0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1d8b0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1d8c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d8d0 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1d8e0 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1d8f0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1d900 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1d910 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1d920 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1d930 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1d940 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1d950 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1d960 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1d970 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1d980 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1d990 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1d9a0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1d9b0 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1d9c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1d9d0 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1d9e0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1d9f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1da00 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1da10 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1da20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1da30 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1da40 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1da50 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1da60 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1da70 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1da80 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1da90 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1daa0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1dab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dac0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1dad0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1dae0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1daf0 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1db00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1db10 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1db20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1db30 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1db40 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1db50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1db60 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1db70 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1db80 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1db90 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1dba0 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1dbb0 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1dbc0 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1dbd0 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1dbe0 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1dbf0 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c  >nSrc<1.       |
1dc00 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  | pSub->pEList->
1dc10 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45  nExpr!=pSub1->pE
1dc20 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
1dc30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1dc40 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1dc50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1dc60 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1dc70 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1dc80 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1dc90 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1dca0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1dcb0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1dcc0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1dcd0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1dce0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1dcf0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1dd00 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1dd10 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1dd20 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1dd30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1dd40 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1dd50 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1dd60 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1dd70 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
1dd80 4c 45 43 54 54 52 41 43 45 28 31 2c 20 28 22 66  LECTTRACE(1, ("f
1dd90 6c 61 74 74 65 6e 20 25 73 20 28 74 65 72 6d 20  latten %s (term 
1dda0 25 64 29 20 69 6e 74 6f 20 25 73 5c 6e 22 2c 0a  %d) into %s\n",.
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4c 61 62     pSub->zSelLab
1ddd0 65 6c 2c 20 69 46 72 6f 6d 2c 20 70 2d 3e 7a 53  el, iFrom, p->zS
1dde0 65 6c 4c 61 62 65 6c 29 29 3b 0a 0a 20 20 2f 2a  elLabel));..  /*
1ddf0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1de00 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1de10 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1de20 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1de30 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1de40 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1de50 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1de60 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1de70 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1de80 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1de90 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1dea0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1deb0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1dec0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1ded0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1dee0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1def0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1df00 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1df10 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1df20 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1df30 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1df40 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1df50 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1df60 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1df70 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1df80 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1df90 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1dfa0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1dfb0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1dfc0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1dfd0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1dfe0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1dff0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1e000 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1e010 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1e020 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1e030 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1e040 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1e050 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1e060 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1e070 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1e080 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1e090 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1e0a0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1e0b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1e0c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e0d0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1e0e0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1e0f0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1e100 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1e110 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1e120 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1e130 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1e140 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1e150 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1e160 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1e170 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1e180 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1e190 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1e1a0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1e1b0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1e1c0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1e1d0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1e1e0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1e1f0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1e200 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1e210 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1e220 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1e230 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1e240 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1e250 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1e260 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1e270 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1e280 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1e290 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1e2a0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1e2b0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1e2c0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1e2d0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1e2e0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1e2f0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1e300 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1e310 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1e320 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1e330 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1e340 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1e350 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1e360 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1e370 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1e380 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1e390 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1e3a0 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1e3b0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1e3c0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1e3d0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1e3e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1e3f0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1e400 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1e410 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1e420 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1e430 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1e440 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1e450 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1e460 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1e470 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1e480 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1e490 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1e4a0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1e4b0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1e4c0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1e4d0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
1e4e0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1e4f0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1e500 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1e510 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1e520 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1e530 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
1e540 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1e550 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
1e560 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
1e570 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1e580 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pNew;.    }.    
1e590 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e5a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1e5b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1e5c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1e5d0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1e5e0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1e5f0 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1e600 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1e610 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1e620 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1e630 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1e640 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1e650 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1e660 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e670 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1e680 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1e690 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1e6a0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1e6b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1e6c0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1e6d0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1e6e0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1e6f0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1e700 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1e710 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
1e720 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1e730 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
1e740 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
1e750 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
1e760 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
1e770 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
1e780 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1e790 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1e7a0 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
1e7b0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
1e7c0 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
1e7d0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
1e7e0 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
1e7f0 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
1e800 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
1e810 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
1e820 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
1e830 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
1e840 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
1e850 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
1e860 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
1e870 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
1e880 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
1e890 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
1e8a0 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
1e8b0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
1e8c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
1e8d0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
1e8e0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
1e8f0 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
1e900 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
1e910 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1e920 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1e930 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
1e940 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
1e950 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
1e960 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
1e970 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1e980 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
1e990 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
1e9a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
1e9b0 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
1e9c0 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
1e9d0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
1e9e0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1e9f0 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
1ea00 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
1ea10 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
1ea20 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
1ea30 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
1ea40 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
1ea50 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1ea60 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
1ea70 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
1ea80 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
1ea90 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
1eaa0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1eab0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
1eac0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
1ead0 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
1eae0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1eaf0 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
1eb00 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
1eb10 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
1eb20 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1eb30 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1eb40 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1eb50 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
1eb60 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
1eb70 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
1eb80 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
1eb90 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
1eba0 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
1ebb0 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
1ebc0 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
1ebd0 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
1ebe0 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
1ebf0 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
1ec00 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
1ec10 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
1ec20 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
1ec30 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
1ec40 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
1ec50 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
1ec60 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1ec70 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
1ec80 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
1ec90 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
1eca0 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
1ecb0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
1ecc0 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
1ecd0 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
1ece0 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
1ecf0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1ed00 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
1ed10 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
1ed20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
1ed30 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
1ed40 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
1ed50 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
1ed60 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
1ed70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
1ed80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1ed90 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
1eda0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1edb0 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1edc0 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
1edd0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ede0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1edf0 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
1ee00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ee10 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
1ee20 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
1ee30 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1ee40 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
1ee50 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
1ee60 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
1ee70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1ee80 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
1ee90 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
1eea0 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
1eeb0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1eec0 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1eed0 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
1eee0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1eef0 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
1ef00 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
1ef10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1ef20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ef30 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
1ef40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ef50 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
1ef60 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
1ef70 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
1ef80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1ef90 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
1efa0 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
1efb0 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
1efc0 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
1efd0 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
1efe0 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
1eff0 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
1f000 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
1f010 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
1f020 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
1f030 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
1f040 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1f050 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1f060 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1f070 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1f080 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
1f090 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
1f0a0 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
1f0b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
1f0c0 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
1f0d0 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
1f0e0 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
1f0f0 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
1f100 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
1f110 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
1f120 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
1f130 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
1f140 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
1f150 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
1f160 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79  nd the out query
1f170 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68   to 4 slots.  Th
1f180 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20  e middle.    ** 
1f190 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
1f1a0 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
1f1b0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
1f1c0 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  pace for the.   
1f1d0 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1f1e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f1f0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1f200 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1f210 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
1f220 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1f230 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
1f240 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1f250 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
1f260 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
1f270 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
1f280 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1f290 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1f2a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f2b0 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
1f2c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1f2d0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
1f2e0 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1f2f0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1f300 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1f310 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
1f320 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1f330 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1f340 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
1f350 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
1f360 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
1f370 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
1f380 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
1f390 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
1f3a0 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
1f3b0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
1f3c0 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
1f3d0 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
1f3e0 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
1f3f0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
1f400 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
1f410 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
1f420 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
1f430 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
1f440 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
1f450 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
1f460 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
1f470 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1f480 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f490 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
1f4a0 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
1f4b0 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
1f4c0 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
1f4d0 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
1f4e0 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1f4f0 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1f500 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
1f510 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
1f520 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
1f530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f540 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
1f550 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
1f560 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1f570 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
1f580 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
1f590 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
1f5a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1f5b0 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
1f5c0 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
1f5d0 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
1f5e0 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
1f5f0 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
1f600 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
1f610 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
1f620 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
1f630 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
1f640 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1f650 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1f660 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
1f670 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
1f680 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
1f690 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
1f6a0 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
1f6b0 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
1f6c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
1f6d0 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
1f6e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1f6f0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
1f700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f710 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1f720 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
1f730 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
1f740 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1f750 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
1f760 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f770 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
1f780 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
1f790 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1f7a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1f7b0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
1f7c0 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
1f7d0 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
1f7e0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1f7f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f800 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1f810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f820 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1f830 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1f840 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
1f850 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
1f860 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
1f870 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
1f880 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74  else if( pParent
1f890 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1f8a0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1f8b0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1f8c0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
1f8d0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
1f8e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f8f0 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
1f900 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71       pWhere = sq
1f910 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1f920 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
1f930 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1f940 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
1f950 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75      }.    if( su
1f960 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1f970 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1f980 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  rent->pHaving==0
1f990 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1f9a0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61  t->pHaving = pPa
1f9b0 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20  rent->pWhere;.  
1f9c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
1f9d0 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
1f9e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1f9f0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1fa00 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
1fa10 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
1fa20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1fa30 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1fa40 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
1fa50 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
1fa60 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1faa0 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
1fab0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
1fac0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
1fad0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
1fae0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
1faf0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
1fb00 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
1fb10 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
1fb20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fb30 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1fb40 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
1fb50 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
1fb60 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
1fb70 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1fb80 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1fb90 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
1fba0 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
1fbb0 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
1fbc0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1fbd0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
1fbe0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1fbf0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
1fc00 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
1fc10 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
1fc20 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
1fc30 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
1fc40 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
1fc50 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1fc60 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
1fc70 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
1fc80 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
1fc90 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
1fca0 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
1fcb0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
1fcc0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
1fcd0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
1fce0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
1fcf0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
1fd00 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
1fd10 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
1fd20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
1fd30 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
1fd40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fd50 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
1fd60 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1fd70 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
1fd80 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
1fd90 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
1fda0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1fdb0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
1fdc0 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
1fdd0 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
1fde0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
1fdf0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
1fe00 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1fe10 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20  (db, pSub1);..  
1fe20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
1fe30 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
1fe40 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1fe50 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1fe60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1fe70 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73  W) */../*.** Bas
1fe80 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
1fe90 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66  ts of the AggInf
1fea0 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  o structure indi
1feb0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72  cated by the fir
1fec0 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20  st.** argument, 
1fed0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  this function ch
1fee0 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ecks if the foll
1fef0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1ff00 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71  **.**    * the q
1ff10 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75  uery contains ju
1ff20 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72  st a single aggr
1ff30 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a  egate function,.
1ff40 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72  **    * the aggr
1ff50 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1ff60 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f  s either min() o
1ff70 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20  r max(), and.** 
1ff80 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e     * the argumen
1ff90 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
1ffa0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
1ffb0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a   column value..*
1ffc0 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74  *.** If all of t
1ffd0 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75  he above are tru
1ffe0 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52  e, then WHERE_OR
1fff0 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
20000 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a  RE_ORDERBY_MAX.*
20010 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  * is returned as
20020 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c   appropriate. Al
20030 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  so, *ppMinMax is
20040 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
20050 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66   the .** list of
20060 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
20070 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  d to the aggrega
20080 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  te before return
20090 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ing..**.** Or, i
200a0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  f the conditions
200b0 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d   above are not m
200c0 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  et, *ppMinMax is
200d0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
200e0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
200f0 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65  ORMAL is returne
20100 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  d..*/.static u8 
20110 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49  minMaxQuery(AggI
20120 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45  nfo *pAggInfo, E
20130 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
20140 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
20150 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
20160 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20  NORMAL;         
20170 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
20180 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78   */..  *ppMinMax
20190 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67   = 0;.  if( pAgg
201a0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29  Info->nFunc==1 )
201b0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
201c0 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  r = pAggInfo->aF
201d0 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a  unc[0].pExpr; /*
201e0 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
201f0 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  ion */.    ExprL
20200 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45  ist *pEList = pE
20210 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
20220 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
20230 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
20240 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
20250 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
20260 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
20270 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
20280 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
20290 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
202a0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  .pExpr->op==TK_A
202b0 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
202c0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
202d0 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e  Func = pExpr->u.
202e0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66  zToken;.      if
202f0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
20300 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
20310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
20320 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
20330 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MIN;.        *
20340 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
20350 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
20360 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
20370 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
20380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
20390 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
203a0 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  BY_MAX;.        
203b0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
203c0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
203d0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
203e0 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c   *ppMinMax==0 ||
203f0 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45   (*ppMinMax)->nE
20400 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  xpr==1 );.  retu
20410 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
20420 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
20430 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
20440 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
20450 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
20460 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
20470 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20480 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
20490 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
204a0 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
204b0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
204c0 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
204d0 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
204e0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
204f0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
20500 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
20510 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
20520 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
20530 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
20540 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
20550 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
20560 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
20570 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
20580 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
20590 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
205a0 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
205b0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
205c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
205d0 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
205e0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
205f0 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
20600 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
20610 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
20620 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
20630 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
20640 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
20650 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
20660 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
20670 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
20680 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
20690 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
206a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
206b0 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
206c0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
206d0 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
206e0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
206f0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
20700 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
20710 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
20720 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
20730 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
20740 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
20750 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
20760 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
20770 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
20780 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
20790 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
207a0 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
207b0 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
207c0 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
207d0 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
207e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
207f0 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
20800 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
20810 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
20820 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
20830 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
20840 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
20850 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
20860 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
20870 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
20880 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
20890 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
208a0 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
208b0 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
208c0 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
208d0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
208e0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
208f0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
20900 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
20910 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
20920 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
20930 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
20940 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
20950 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20960 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
20970 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
20980 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
20990 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
209a0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
209b0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
209c0 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
209d0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
209e0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
209f0 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
20a00 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
20a10 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
20a20 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
20a30 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
20a40 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
20a50 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
20a60 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
20a70 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
20a80 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
20a90 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
20aa0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
20ab0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20ac0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
20ad0 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
20ae0 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
20af0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
20b00 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
20b10 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
20b30 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
20b40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20b50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
20b60 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
20b70 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
20b80 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
20b90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
20ba0 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
20bb0 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
20bc0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
20bd0 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
20be0 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
20bf0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20c00 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
20c10 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
20c20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
20c30 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
20c40 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
20c50 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
20c60 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
20c70 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
20c80 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
20c90 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
20ca0 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
20cb0 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
20cc0 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
20cd0 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
20ce0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
20cf0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
20d00 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
20d10 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
20d20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
20d30 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
20d40 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
20d50 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
20d60 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
20d70 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
20d80 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
20d90 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
20da0 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
20db0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
20dc0 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
20dd0 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
20de0 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
20df0 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
20e00 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
20e10 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
20e20 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
20e30 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
20e40 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
20e50 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
20e60 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
20e70 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
20e80 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
20e90 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
20ea0 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
20eb0 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
20ec0 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
20ed0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
20ee0 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
20ef0 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
20f00 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
20f10 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
20f20 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
20f30 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
20f40 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
20f50 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
20f60 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
20f70 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
20f80 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
20f90 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
20fa0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
20fb0 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
20fc0 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
20fd0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
20fe0 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
20ff0 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
21000 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
21010 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
21020 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
21030 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
21040 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
21050 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
21060 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
21070 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
21080 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
21090 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
210a0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
210b0 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
210c0 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
210d0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
210e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
210f0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
21100 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
21110 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
21120 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
21130 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
21140 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
21150 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
21160 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
21170 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
21180 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
21190 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
211a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
211b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
211c0 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
211d0 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
211e0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
211f0 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
21200 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
21210 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
21220 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
21230 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
21240 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
21250 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
21260 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
21270 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
21280 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
21290 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
212a0 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29  (db, TK_ALL, 0))
212b0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
212c0 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
212d0 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
212e0 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
212f0 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
21300 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
21310 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
21320 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
21330 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  Next = 0;.  p->s
21340 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
21350 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
21360 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21  t( pNew->pPrior!
21370 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  =0 );.  pNew->pP
21380 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
21390 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  ew;.  pNew->pLim
213a0 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
213b0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72  pOffset = 0;.  r
213c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
213d0 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ue;.}..#ifndef S
213e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
213f0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
21400 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
21410 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
21420 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
21430 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
21440 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
21450 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
21460 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
21470 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
21480 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
21490 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
214a0 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
214b0 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
214c0 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
214d0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
214e0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
214f0 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
21500 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
21510 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
21520 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
21530 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
21540 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
21550 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
21560 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
21570 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
21580 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
21590 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
215a0 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
215b0 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
215c0 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
215e0 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f   Current outermo
215f0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
21600 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
21610 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
21620 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
21630 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
21640 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
21650 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
21660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
21670 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
21680 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
21690 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
216a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
216b0 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
216c0 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
216d0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
216e0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
216f0 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
21700 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
21710 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
21720 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
21730 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
21740 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21750 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
21760 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
21770 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
21780 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
21790 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
217a0 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
217b0 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
217c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
217d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
217e0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
217f0 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
21800 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
21810 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
21820 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
21830 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
21840 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
21850 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
21860 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21870 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
21880 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
21890 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
218a0 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
218b0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
218c0 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
218d0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
218e0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
218f0 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
21900 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
21910 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
21920 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
21930 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
21940 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
21950 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
21960 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
21970 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
21980 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
21990 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
219a0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
219b0 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
219c0 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
219d0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
219e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
219f0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
21a00 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
21a10 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
21a20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
21a30 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 57 69  0 || pParse->pWi
21a40 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  th==0 );.  if( p
21a50 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57 69 74  With ){.    pWit
21a60 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
21a70 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
21a80 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
21a90 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
21aa0 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20 62 46  ->bFreeWith = bF
21ab0 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ree;.  }.}../*.*
21ac0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21ad0 63 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65  checks if argume
21ae0 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20  nt pFrom refers 
21af0 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65  to a CTE declare
21b00 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20  d by .** a WITH 
21b10 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74  clause on the st
21b20 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61  ack currently ma
21b30 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
21b40 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20  parser. And,.** 
21b50 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f  if currently pro
21b60 63 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78  cessing a CTE ex
21b70 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20  pression, if it 
21b80 69 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a  is a recursive.*
21b90 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  * reference to t
21ba0 68 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a  he current CTE..
21bb0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66  **.** If pFrom f
21bc0 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72  alls into either
21bd0 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65   of the two cate
21be0 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46  gories above, pF
21bf0 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64  rom->pTab.** and
21c00 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
21c10 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f  e populated acco
21c20 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c  rdingly. The cal
21c30 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b  ler should check
21c40 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62  .** (pFrom->pTab
21c50 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  !=0) to determin
21c60 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
21c70 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61   a successful ma
21c80 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64  tch.** was found
21c90 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
21ca0 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69  or not a match i
21cb0 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f  s found, SQLITE_
21cc0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
21cd0 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f no error.** oc
21ce0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
21cf0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e  r does occur, an
21d00 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
21d10 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a  s stored in the.
21d20 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f  ** parser and so
21d30 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  me error code ot
21d40 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
21d50 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
21d60 73 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45  static int withE
21d70 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20  xpand(.  Walker 
21d80 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72  *pWalker, .  str
21d90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21da0 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72   *pFrom.){.  Par
21db0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
21dc0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
21dd0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21de0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75  arse->db;.  stru
21df0 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20  ct Cte *pCte;   
21e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
21e10 61 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e  atched CTE (or N
21e20 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29  ULL if no match)
21e30 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
21e40 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
21e50 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c        /* WITH cl
21e60 61 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62  ause that pCte b
21e70 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20  elongs to */..  
21e80 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
21e90 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74  Tab==0 );..  pCt
21ea0 65 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70  e = searchWith(p
21eb0 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46  Parse->pWith, pF
21ec0 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20  rom, &pWith);.  
21ed0 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20  if( pCte ){.    
21ee0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
21ef0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
21f00 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
21f10 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  Sel;.    Select 
21f20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20  *pLeft;         
21f30 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d         /* Left-m
21f40 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
21f50 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ment */.    int 
21f60 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20  bMayRecursive;  
21f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21f80 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f  e if compound jo
21f90 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41  ined by UNION [A
21fa0 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20  LL] */.    With 
21fb0 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20  *pSavedWith;    
21fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
21fd0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ial value of pPa
21fe0 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20  rse->pWith */.. 
21ff0 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a     /* If pCte->z
22000 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
22010 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
22020 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
22030 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
22040 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
22050 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
22060 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
22070 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
22080 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
22090 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69   If pCte->zErr i
220a0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
220b0 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
220c0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
220d0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
220e0 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
220f0 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
22100 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  zErr ){.      sq
22110 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22120 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72  arse, pCte->zErr
22130 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
22140 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22150 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
22160 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ..    assert( pF
22170 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
22180 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
22190 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
221a0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
221b0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
221c0 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
221d0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
221e0 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e  ort;.    pTab->n
221f0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
22200 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
22210 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
22220 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
22230 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
22240 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
22250 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
22260 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
22270 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
22280 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
22290 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
222a0 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46  phemeral;.    pF
222b0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
222c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
222d0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
222e0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
222f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22300 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22310 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72  NOMEM;.    asser
22320 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
22330 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t );..    /* Che
22340 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ck if this is a 
22350 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a  recursive CTE. *
22360 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72  /.    pSel = pFr
22370 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
22380 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d   bMayRecursive =
22390 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f   ( pSel->op==TK_
223a0 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d  ALL || pSel->op=
223b0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
223c0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
223d0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ve ){.      int 
223e0 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74  i;.      SrcList
223f0 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e   *pSrc = pFrom->
22400 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
22410 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
22420 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
22430 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
22440 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
22450 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
22460 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
22470 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
22480 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  ==0 .         &&
22490 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30   pItem->zName!=0
224a0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d   .         && 0=
224b0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
224c0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43  pItem->zName, pC
224d0 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20  te->zName).     
224e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
224f0 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20    pItem->pTab = 
22500 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
22510 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  pItem->isRecursi
22520 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ve = 1;.        
22530 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
22540 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
22550 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
22560 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
22570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22580 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
22590 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
225a0 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
225b0 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
225c0 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b   pTab->nRef>2 ){
225d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
225e0 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20  rorMsg(.        
225f0 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69    pParse, "multi
22600 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
22610 6f 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  o recursive tabl
22620 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e  e: %s", pCte->zN
22630 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
22640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22650 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
22660 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
22670 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65  nRef==1 || ((pSe
22680 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52  l->selFlags&SF_R
22690 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61  ecursive) && pTa
226a0 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  b->nRef==2 ));..
226b0 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
226c0 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
226d0 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
226e0 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
226f0 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
22700 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
22710 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65  With;.    sqlite
22720 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
22730 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69  ker, bMayRecursi
22740 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ve ? pSel->pPrio
22750 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20  r : pSel);..    
22760 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20  for(pLeft=pSel; 
22770 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70  pLeft->pPrior; p
22780 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69  Left=pLeft->pPri
22790 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  or);.    pEList 
227a0 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b  = pLeft->pEList;
227b0 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70  .    if( pCte->p
227c0 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Cols ){.      if
227d0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
227e0 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
227f0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
22800 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
22810 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
22820 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
22830 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
22840 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
22850 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
22860 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
22870 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
22880 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
22890 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
228a0 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
228b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
228c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
228d0 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
228e0 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
228f0 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75  ..    selectColu
22900 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
22910 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
22920 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
22930 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
22940 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
22950 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
22960 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
22970 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
22980 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72         pCte->zEr
22990 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
229a0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
229b0 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
229c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
229d0 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75  te->zErr = "recu
229e0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
229f0 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25  in a subquery: %
22a00 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s";.      }.    
22a10 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
22a20 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
22a30 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  l);.    }.    pC
22a40 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20  te->zErr = 0;.  
22a50 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
22a60 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
22a70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
22a80 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
22a90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22aa0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
22ab0 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
22ac0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
22ad0 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
22ae0 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
22af0 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
22b00 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
22b10 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
22b20 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
22b30 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
22b40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
22b50 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
22b60 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
22b70 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
22b80 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
22b90 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
22ba0 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
22bb0 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
22bc0 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
22bd0 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
22be0 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
22bf0 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
22c00 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
22c10 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
22c20 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
22c30 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
22c40 61 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57  arse;.  With *pW
22c50 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d  ith = findRightm
22c60 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20  ost(p)->pWith;. 
22c70 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b   if( pWith!=0 ){
22c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22c90 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74  rse->pWith==pWit
22ca0 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  h );.    pParse-
22cb0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
22cc0 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65  pOuter;.  }.}.#e
22cd0 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65  lse.#define sele
22ce0 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64  ctPopWith 0.#end
22cf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
22d00 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
22d10 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
22d20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
22d30 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
22d40 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
22d50 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
22d60 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
22d70 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
22d80 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
22d90 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
22da0 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
22db0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
22dc0 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
22dd0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
22de0 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
22df0 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
22e00 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
22e10 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
22e20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
22e30 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
22e40 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
22e50 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
22e60 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
22e70 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
22e80 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
22e90 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
22ea0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
22eb0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
22ec0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
22ed0 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
22ee0 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
22ef0 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
22f00 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
22f10 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
22f20 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
22f30 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
22f40 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
22f50 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
22f60 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
22f70 67 20 75 70 20 74 68 65 20 70 65 72 73 69 73 74  g up the persist
22f80 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
22f90 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
22fa0 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
22fb0 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
22fc0 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
22fd0 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d  clause to accomm
22fe0 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
22ff0 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
23000 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
23010 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
23020 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
23030 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
23040 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
23050 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
23060 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
23070 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
23080 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
23090 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
230a0 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
230b0 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
230c0 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
230d0 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
230e0 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
230f0 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
23100 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
23110 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
23120 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
23130 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
23140 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
23150 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
23160 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
23170 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
23180 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
23190 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
231a0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
231b0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
231c0 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
231d0 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
231e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
231f0 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
23200 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
23210 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
23220 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
23230 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
23240 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
23250 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
23260 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
23270 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
23280 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
23290 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
232a0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
232b0 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
232c0 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
232d0 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
232e0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
232f0 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
23300 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
23310 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
23320 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
23330 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69  h(pParse, findRi
23340 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
23350 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
23360 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
23370 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
23380 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
23390 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
233a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
233b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
233c0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
233d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
233e0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
233f0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
23400 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
23410 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
23420 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23430 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
23440 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
23450 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
23460 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
23470 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
23480 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
23490 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
234a0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
234b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
234c0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
234d0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
234e0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
234f0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
23500 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
23510 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
23520 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
23530 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
23540 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c  sRecursive==0 ||
23550 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a   pFrom->pTab );.
23560 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69      if( pFrom->i
23570 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
23580 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
23590 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  From->pTab!=0 ){
235a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
235b0 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72  tatement has alr
235c0 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
235d0 65 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ed.  There is no
235e0 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74   need.      ** t
235f0 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f  o go further. */
23600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
23610 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==0 );.#ifndef S
23620 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
23630 20 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69       selectPopWi
23640 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a  th(pWalker, p);.
23650 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74  #endif.      ret
23660 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
23670 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
23680 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
23690 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
236a0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
236b0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
236c0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
236d0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
236e0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
236f0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
23700 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
23710 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
23720 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
23730 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
23740 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
23750 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
23760 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
23770 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
23780 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
23790 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
237a0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
237b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
237c0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
237d0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
237e0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
237f0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
23800 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
23810 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
23820 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
23830 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23840 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
23850 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  b->nRef = 1;.   
23860 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
23870 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
23880 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25  db, "sqlite_sq_%
23890 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  p", (void*)pTab)
238a0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
238b0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
238c0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
238d0 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
238e0 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
238f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
23900 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
23910 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
23920 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
23930 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
23940 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
23950 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
23960 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
23970 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
23980 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
23990 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
239a0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
239b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
239c0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
239d0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
239e0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
239f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
23a00 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
23a10 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
23a20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23a30 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
23a40 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
23a50 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
23a60 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
23a70 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
23a80 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
23a90 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66  Tab->nRef==0xfff
23aa0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
23ab0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23ac0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
23ad0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
23ae0 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
23af0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
23b00 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23b10 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
23b20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
23b30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
23b40 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
23b50 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65  >nRef++;.#if !de
23b60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23b70 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
23b80 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ned (SQLITE_OMIT
23b90 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
23ba0 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70       if( pTab->p
23bb0 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74  Select || IsVirt
23bc0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
23bd0 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68       /* We reach
23be0 20 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d   here if the nam
23bf0 65 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65  ed table is a re
23c00 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20  ally a view */. 
23c10 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23c20 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
23c30 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
23c40 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  b) ) return WRC_
23c50 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Abort;.        a
23c60 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
23c70 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
23c80 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
23c90 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
23ca0 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e  ctDup(db, pTab->
23cb0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
23cc0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
23cd0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
23ce0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
23cf0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
23d00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
23d10 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
23d20 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
23d30 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
23d40 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
23d50 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
23d60 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
23d70 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
23d80 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
23d90 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
23da0 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
23db0 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
23dc0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
23dd0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
23de0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
23df0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
23e00 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
23e10 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
23e20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
23e30 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
23e40 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
23e50 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
23e60 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
23e70 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
23e80 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
23e90 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
23ea0 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
23eb0 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
23ec0 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
23ed0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
23ee0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
23ef0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
23f00 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
23f10 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
23f20 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
23f30 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
23f40 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
23f50 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
23f60 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23f70 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
23f80 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
23f90 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
23fa0 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
23fb0 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
23fc0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
23fd0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
23fe0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
23ff0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
24000 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
24010 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
24020 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
24030 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
24040 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
24050 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
24060 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
24070 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
24080 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
24090 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
240a0 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
240b0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
240c0 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
240d0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
240e0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
240f0 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
24100 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
24110 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
24120 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
24130 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
24140 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
24150 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
24160 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
24170 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
24180 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
24190 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
241a0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
241b0 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
241c0 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
241d0 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
241e0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
241f0 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
24200 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
24210 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
24220 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
24230 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
24240 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
24250 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
24260 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
24270 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
24280 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
24290 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
242a0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
242b0 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
242c0 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
242d0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
242e0 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
242f0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
24300 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
24310 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
24320 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  ;..    /* When p
24330 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63  rocessing FROM-c
24340 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
24350 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74  , it is always t
24360 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74  he case.    ** t
24370 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  hat full_column_
24380 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68  names=OFF and sh
24390 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
243a0 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  =ON.  The.    **
243b0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
243c0 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74  tOfSelect() rout
243d0 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e  ine makes it so.
243e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
243f0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
24400 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
24410 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  .          || ((
24420 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
24430 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20  ullColNames)==0 
24440 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
24450 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
24460 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
24470 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  =0) );..    for(
24480 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
24490 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
244a0 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
244b0 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
244c0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
244d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
244e0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
244f0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
24500 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
24510 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d  ALL && (pE->op!=
24520 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
24530 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
24540 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
24550 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
24560 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
24570 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
24580 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
24590 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
245a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
245b0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
245c0 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
245d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
245e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
245f0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
24600 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
24610 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
24620 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
24630 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
24640 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
24650 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
24660 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
24670 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
24680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24690 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
246a0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
246b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
246c0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
246d0 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
246e0 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
246f0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
24700 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
24710 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
24720 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
24730 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
24740 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
24750 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
24760 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
24770 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
24780 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
24790 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
247a0 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
247b0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
247c0 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
247d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
247e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
247f0 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
24800 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
24810 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
24820 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
24830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24840 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
24850 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
24860 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
24870 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
24880 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
24890 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
248a0 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
248b0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
248c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
248d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
248e0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
248f0 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
24900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
24910 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
24920 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
24930 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
24940 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
24950 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
24960 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
24970 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24980 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
24990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
249a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
249b0 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
249c0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
249d0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
249e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
249f0 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
24a00 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
24a10 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
24a20 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
24a30 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
24a40 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24a50 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
24a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
24a70 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
24a80 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
24a90 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
24aa0 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
24ab0 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
24ac0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
24ad0 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
24ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24af0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
24b00 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
24b10 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
24b20 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
24b30 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
24b40 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
24b50 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
24b60 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
24b70 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
24b80 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
24b90 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
24ba0 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
24bb0 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
24bc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
24bd0 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
24be0 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
24bf0 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
24c00 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
24c10 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
24c20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24c30 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
24c40 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
24c50 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
24c60 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
24c70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
24c80 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
24c90 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
24ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24cb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24cc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24cd0 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
24ce0 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
24cf0 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
24d00 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
24d10 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
24d20 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
24d30 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
24d40 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
24d50 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
24d60 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
24d70 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
24d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24d90 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
24da0 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
24db0 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
24dc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
24dd0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
24de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24df0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24e10 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
24e20 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
24e30 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
24e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
24e50 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
24e60 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
24e70 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
24e80 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
24e90 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
24ea0 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
24eb0 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
24ec0 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ee0 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
24ef0 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
24f00 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
24f10 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
24f20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
24f30 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
24f40 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
24f50 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
24f60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24f70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
24f80 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
24f90 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
24fa0 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
24fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24fc0 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
24fd0 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
24fe0 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
24ff0 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
25000 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
25010 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
25020 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
25030 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
25040 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25050 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
25060 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
25070 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
25080 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
25090 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
250a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
250b0 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
250c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
250d0 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
250e0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
250f0 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
25100 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
25110 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
25120 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
25130 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
25140 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
25150 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
25170 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
25180 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
25190 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
251a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
251b0 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
251c0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
251d0 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
251e0 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
251f0 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
25200 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
25210 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
25220 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
25230 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
25240 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
25250 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25260 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
25270 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
25280 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
25290 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
252a0 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
252b0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
252c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
252d0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
252e0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
252f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25310 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
25320 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
25330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25340 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
25350 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
25360 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
25370 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
25380 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43   sColname.z = zC
25390 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
253a0 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d      sColname.n =
253b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
253c0 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  (zColname);.    
253d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
253e0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
253f0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
25400 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
25410 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
25420 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
25430 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
25440 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25450 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
25460 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
25470 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
25480 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
25490 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
254a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
254b0 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
254c0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
254d0 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
254e0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
25500 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
25510 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
25520 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
25540 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
25550 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
25560 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
25570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
255a0 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
255b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
255c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
255d0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
25600 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
25610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
25620 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25630 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
25640 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
25650 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
25660 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
25670 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
25680 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
25690 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
256a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
256b0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
256c0 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
256d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
256e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
256f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
25700 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
25710 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
25720 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25730 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25740 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
25750 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
25760 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
25770 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
25780 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
25790 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
257a0 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
257b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
257c0 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
257d0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
257e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
257f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
25800 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
25810 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
25820 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
25830 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
25850 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
25860 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
25870 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
25880 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
25890 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
258a0 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
258b0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
258c0 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
258d0 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
258e0 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
258f0 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
25900 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
25910 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
25920 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
25930 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
25940 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
25950 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
25960 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
25970 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
25980 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
25990 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
259a0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
259b0 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  int exprWalkNoop
259c0 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
259d0 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
259e0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
259f0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
25a00 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
25a10 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25a30 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
25a40 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
25a50 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
25a60 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
25a70 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
25a80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
25a90 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
25aa0 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
25ab0 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
25ac0 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
25ad0 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
25ae0 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
25af0 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
25b00 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
25b10 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
25b20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
25b30 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
25b40 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
25b50 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
25b60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
25b70 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
25b80 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
25b90 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
25ba0 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
25bb0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
25bc0 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
25bd0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
25be0 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
25bf0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
25c00 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
25c10 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
25c20 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
25c30 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
25c40 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
25c50 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
25c60 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
25c70 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
25c80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
25c90 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
25ca0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
25cb0 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
25cc0 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
25cd0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
25ce0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
25cf0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
25d00 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
25d10 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
25d20 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
25d30 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
25d40 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
25d50 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
25d60 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
25d70 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
25d80 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
25d90 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
25da0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
25db0 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
25dc0 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
25dd0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
25de0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
25df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25e00 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
25e10 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
25e20 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
25e30 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
25e40 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
25e50 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
25e60 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
25e70 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
25e80 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
25e90 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
25ea0 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
25eb0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
25ec0 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
25ed0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
25ee0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
25ef0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
25f00 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
25f10 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
25f20 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
25f30 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
25f40 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
25f50 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
25f60 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
25f70 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
25f80 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
25f90 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
25fa0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
25fb0 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
25fc0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
25fd0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
25fe0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
25ff0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
26000 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
26010 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
26020 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
26030 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
26040 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
26050 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
26060 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
26070 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
26080 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
26090 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
260a0 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
260b0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
260c0 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
260d0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
260e0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
260f0 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
26100 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
26110 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
26120 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
26130 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
26140 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
26150 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
26160 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
26170 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
26180 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
26190 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
261a0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
261b0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
261c0 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20  ALWAYS(pTab!=0) 
261d0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
261e0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
261f0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
26200 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
26210 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
26220 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
26230 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
26240 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
26250 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
26260 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
26270 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
26280 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
26290 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
262a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 6c 65  ;.          sele
262b0 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
262c0 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
262d0 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b  se, pTab, pSel);
262e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
262f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23   }.    }.  }.}.#
26300 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
26310 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
26320 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c  datatype and col
26330 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
26340 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a  information to.*
26350 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  * the Table stru
26360 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52  ctures of all FR
26370 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
26380 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c  ries in a.** SEL
26390 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
263a0 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f  *.** Use this ro
263b0 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65  utine after name
263c0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
263d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
263e0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
263f0 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
26400 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
26410 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ect){.#ifndef SQ
26420 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
26430 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  RY.  Walker w;. 
26440 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
26450 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
26460 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
26470 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
26480 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
26490 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
264a0 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
264b0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
264c0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
264d0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
264e0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
264f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
26500 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
26510 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
26520 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
26530 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
26540 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
26550 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
26560 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
26570 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
26580 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
26590 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
265a0 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
265b0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
265c0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
265d0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
265e0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
265f0 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
26600 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
26610 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
26620 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
26630 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
26640 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
26650 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
26660 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
26670 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
26680 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
26690 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
266a0 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
266b0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
266c0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
266d0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
266e0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
266f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
26700 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
26710 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
26720 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
26730 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
26740 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
26750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
26760 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
26770 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
26780 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
26790 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
267a0 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
267b0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
267c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
267d0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
267e0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
267f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
26800 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26810 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
26820 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
26830 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
26840 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
26850 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
26860 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
26870 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
26880 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26890 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
268a0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
268b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
268c0 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
268d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
268e0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
268f0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
26900 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
26910 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
26920 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
26930 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
26940 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
26950 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
26960 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
26970 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
26980 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
26990 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
269a0 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
269b0 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
269c0 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
269d0 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
269e0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74  tes code that st
269f0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
26a00 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
26a10 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  y.** cells..*/.s
26a20 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
26a30 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
26a40 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
26a50 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
26a60 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
26a70 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
26a80 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
26a90 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
26aa0 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41  .  int nReg = pA
26ab0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20  ggInfo->nFunc + 
26ac0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
26ad0 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30  n;.  if( nReg==0
26ae0 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65   ) return;.#ifde
26af0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
26b00 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
26b10 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69  all AggInfo regi
26b20 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e  sters are within
26b30 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69   the range speci
26b40 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67  fied by.  ** Agg
26b50 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49  Info.mnReg..AggI
26b60 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61  nfo.mxReg */.  a
26b70 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67  ssert( nReg==pAg
26b80 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67  gInfo->mxReg-pAg
26b90 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29  gInfo->mnReg+1 )
26ba0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
26bb0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
26bc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
26bd0 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  rt( pAggInfo->aC
26be0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  ol[i].iMem>=pAgg
26bf0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
26c00 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
26c10 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d  ->aCol[i].iMem<=
26c20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
26c30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
26c40 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
26c50 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  unc; i++){.    a
26c60 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
26c70 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d  >aFunc[i].iMem>=
26c80 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
26c90 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
26ca0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69  Info->aFunc[i].i
26cb0 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem<=pAggInfo->m
26cc0 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  xReg );.  }.#end
26cd0 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  if.  sqlite3Vdbe
26ce0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp3(v, OP_Nul
26cf0 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  l, 0, pAggInfo->
26d00 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d  mnReg, pAggInfo-
26d10 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70  >mxReg);.  for(p
26d20 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  Func=pAggInfo->a
26d30 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67  Func, i=0; i<pAg
26d40 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
26d50 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20  +, pFunc++){.   
26d60 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
26d70 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
26d80 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
26d90 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
26da0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
26db0 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
26dc0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
26dd0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
26de0 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
26df0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
26e00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26e10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26e20 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
26e30 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
26e40 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
26e50 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
26e60 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
26e70 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
26e80 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
26e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
26ea0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
26eb0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
26ec0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
26ed0 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  >x.pList, 0, 0);
26ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26ef0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
26f00 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
26f10 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
26f20 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f40 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
26f50 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
26f60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26f70 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
26f80 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
26f90 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
26fa0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
26fb0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
26fc0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
26fd0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
26fe0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
26ff0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
27000 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
27010 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
27020 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
27030 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
27040 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
27050 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
27060 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
27070 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
27080 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
27090 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
270a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
270b0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
270c0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
270d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
270e0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
270f0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
27100 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27110 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
27120 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
27130 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
27140 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27160 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
27170 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
27180 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
27190 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
271a0 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
271b0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
271c0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
271d0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
271e0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
271f0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
27200 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
27210 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
27220 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
27230 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
27240 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
27250 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
27260 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
27270 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
27280 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
27290 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
272a0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
272b0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
272c0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
272d0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
272e0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
272f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
27300 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
27310 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
27320 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
27330 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
27340 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
27350 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
27360 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
27370 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
27380 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
27390 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
273a0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
273b0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
273c0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
273d0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
273e0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
273f0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
27400 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
27410 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
27420 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
27430 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
27440 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
27450 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
27460 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
27470 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
27480 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
27490 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
274a0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
274b0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
274c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
274d0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
274e0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
274f0 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
27500 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
27510 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
27520 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
27530 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
27540 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
27550 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
27560 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
27570 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
27580 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
27590 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
275a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
275b0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
275c0 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
275d0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
275e0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
275f0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
27600 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
27610 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
27620 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
27630 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
27640 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
27650 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
27660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27670 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
27680 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
27690 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
276a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
276b0 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
276c0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
276d0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
276e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
276f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27700 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
27710 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
27720 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
27730 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
27740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
27750 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
27760 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
27770 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
27780 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
27790 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
277a0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
277b0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
277c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
277d0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
277e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
277f0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
27800 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
27810 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
27820 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
27830 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
27840 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
27850 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
27860 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27870 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
27880 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
27890 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
278a0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
278b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
278c0 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
278d0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
278e0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
278f0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
27900 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
27910 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
27920 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
27930 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
27940 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
27950 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
27960 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
27970 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
27980 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
27990 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
279a0 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
279b0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
279c0 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
279d0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
279e0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
279f0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
27a00 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
27a10 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
27a20 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
27a30 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
27a40 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
27a50 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
27a60 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
27a70 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
27a80 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
27a90 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
27aa0 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
27ab0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
27ac0 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
27ad0 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
27ae0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
27af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27b00 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
27b10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
27b20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
27b30 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
27b40 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
27b50 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
27b60 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
27b70 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
27b80 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
27b90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
27ba0 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
27bb0 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
27bc0 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  }.  pAggInfo->di
27bd0 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  rectMode = 0;.  
27be0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
27bf0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
27c00 20 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
27c10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
27c20 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
27c30 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
27c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
27c50 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
27c60 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
27c70 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
27c80 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
27c90 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
27ca0 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
27cb0 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
27cc0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
27cd0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
27ce0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
27cf0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
27d00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
27d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
27d30 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
27d40 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
27d50 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
27d60 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
27d70 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d90 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
27da0 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
27db0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
27dc0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
27dd0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
27de0 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49  int bCover = (pI
27df0 64 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77  dx!=0 && (HasRow
27e00 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50  id(pTab) || !IsP
27e10 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
27e20 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72  Idx)));.    char
27e30 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
27e40 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
27e50 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
27e60 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
27e70 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
27e80 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
27e90 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
27ea0 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
27eb0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
27ec0 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
27ed0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
27ee0 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
27ef0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
27f00 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
27f10 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
27f20 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
27f30 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
27f40 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
27f50 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
27f60 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
27f70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
27f80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
27f90 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
27fa0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
27fb0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
27fc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
27fd0 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
27fe0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
27ff0 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
28000 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
28010 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
28020 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
28030 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
28040 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28050 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
28060 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
28070 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
28080 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
28090 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
280a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
280b0 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
280c0 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
280d0 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
280e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
280f0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
28100 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
28110 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
28120 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
28130 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
28140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
28150 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
28160 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
28170 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
28180 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
28190 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
281a0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
281b0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
281c0 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
281d0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
281e0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
281f0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
28200 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
28210 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
28220 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28230 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
28240 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
28250 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
28260 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
28270 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
28280 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
28290 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
282a0 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
282b0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
282c0 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
282d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
282e0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
282f0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
28300 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
28310 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
28320 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
28330 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
28340 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
28350 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
28360 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
28370 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
28380 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
28390 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
283a0 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
283b0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
283c0 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
283d0 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
283e0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
283f0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
28400 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
28410 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
28420 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
28430 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
28440 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
28450 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
28460 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
28470 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
28480 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
28490 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
284a0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
284b0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
284c0 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
284d0 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
284e0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
284f0 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
28500 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
28510 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
28520 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
28530 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
28540 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
28550 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
28560 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
28570 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
28580 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
28590 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
285a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
285b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
285c0 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
285d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
285e0 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72  IN.  int iRestor
285f0 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  eSelectId = pPar
28600 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20  se->iSelectId;. 
28610 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
28620 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65  Id = pParse->iNe
28630 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65  xtSelectId++;.#e
28640 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
28650 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
28660 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
28670 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
28680 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
28690 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
286a0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
286b0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
286c0 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
286d0 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
286e0 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
286f0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
28700 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 61 73 73  ggInfo));..  ass
28710 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
28720 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
28730 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66  est!=SRT_DistFif
28740 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
28750 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
28760 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
28770 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  RT_Fifo );.  ass
28780 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
28790 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
287a0 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65  est!=SRT_DistQue
287b0 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ue );.  assert( 
287c0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
287d0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
287e0 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69  SRT_Queue );.  i
287f0 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
28800 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
28810 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
28820 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
28830 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
28840 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
28850 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
28860 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
28870 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
28880 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
28890 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  d ||.           
288a0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
288b0 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73  T_Queue  || pDes
288c0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
288d0 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20  stFifo ||.      
288e0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
288f0 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
28900 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
28910 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20  ==SRT_Fifo);.   
28920 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
28930 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
28940 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
28950 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
28960 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
28970 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
28980 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
28990 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
289a0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
289b0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
289c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
289d0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
289e0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
289f0 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
28a00 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
28a10 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73  e, p, 0);.  mems
28a20 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69  et(&sSort, 0, si
28a30 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20  zeof(sSort));.  
28a40 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
28a50 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
28a60 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
28a70 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
28a80 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
28a90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
28aa0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
28ab0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
28ac0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
28ad0 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
28ae0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
28af0 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74  te)!=0;.  assert
28b00 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a  ( pEList!=0 );..
28b10 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
28b20 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
28b30 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
28b40 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
28b50 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
28b60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
28b70 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
28b80 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
28b90 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
28ba0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
28bb0 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
28bc0 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
28bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
28be0 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
28bf0 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
28c00 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
28c10 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73  se, pDest, pELis
28c20 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
28c30 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
28c40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
28c50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
28c60 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
28c70 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
28c80 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
28c90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
28ca0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
28cb0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
28cc0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
28cd0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
28ce0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
28cf0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
28d00 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
28d10 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
28d20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
28d30 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
28d40 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
28d50 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
28d60 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
28d70 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
28d80 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
28d90 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
28da0 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f  Sometimes the co
28db0 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
28dc0 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  y will be genera
28dd0 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ted more than.  
28de0 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68    ** once, if th
28df0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61  e subquery is pa
28e00 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
28e10 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54  clause in a LEFT
28e20 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f   JOIN,.    ** fo
28e30 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74  r example.  In t
28e40 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74  hat case, do not
28e50 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20   regenerate the 
28e60 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  code to manifest
28e70 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f  .    ** a view o
28e80 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  r the co-routine
28e90 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
28ea0 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74  view.  The first
28eb0 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a   instance.    **
28ec0 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20   is sufficient, 
28ed0 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f  though the subro
28ee0 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73  utine to manifes
28ef0 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20  t the view does 
28f00 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
28f10 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e  e invoked again.
28f20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
28f30 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29  m->addrFillSub )
28f40 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
28f50 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  m->viaCoroutine=
28f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
28f70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28f80 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
28f90 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
28fa0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
28fb0 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
28fc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
28fd0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
28fe0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
28ff0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
29000 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
29010 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
29020 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
29030 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
29040 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
29050 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
29060 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
29070 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
29080 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
29090 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
290a0 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
290b0 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
290c0 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
290d0 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
290e0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
290f0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
29100 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
29110 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
29120 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
29130 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
29140 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
29150 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
29160 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69  eight(p);..    i
29170 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
29180 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
29190 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
291a0 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
291b0 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
291c0 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
291d0 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sub) ){.      /*
291e0 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
291f0 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
29200 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
29210 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41  */.      if( isA
29220 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  ggSub ){.       
29230 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
29240 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
29250 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
29260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29270 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
29280 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
29290 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
292a0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
292b0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
292c0 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e  ITE_SubqCoroutin
292d0 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
292e0 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63  /* Implement a c
292f0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  o-routine that w
29300 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e  ill return a sin
29310 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
29320 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
29330 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  et on each invoc
29340 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
29350 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
29360 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
29370 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
29380 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
29390 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
293a0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
293b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
293c0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
293d0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
293e0 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
293f0 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
29400 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
29410 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
29420 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
29430 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
29440 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
29450 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
29460 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
29470 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
29480 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
29490 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
294a0 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
294b0 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
294c0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
294d0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
294e0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
294f0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
29500 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
29510 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
29520 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
29530 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  Sub->nSelectRow)
29540 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
29550 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
29560 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
29570 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
29580 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
29590 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
295a0 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
295b0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
295c0 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
295d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
295e0 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
295f0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
29600 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
29610 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
29620 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
29630 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
29640 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
29650 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
29660 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
29670 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
29680 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
29690 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
296a0 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
296b0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
296c0 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
296d0 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
296e0 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
296f0 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
29700 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
29710 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
29720 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
29730 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
29740 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
29750 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
29760 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
29770 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
29780 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29790 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
297a0 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
297b0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
297c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
297d0 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
297e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
297f0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
29800 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
29810 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
29820 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
29830 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
29840 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29850 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
29860 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
29870 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
29880 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
29890 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
298a0 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
298b0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
298c0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
298d0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
298e0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
298f0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
29900 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
29910 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
29920 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
29930 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
29940 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
29950 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
29960 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
29970 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
29980 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
29990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
299a0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
299b0 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
299c0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
299d0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
299e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
299f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
29a00 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
29a10 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
29a20 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
29a30 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
29a40 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
29a50 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
29a60 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
29a70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29a80 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
29a90 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
29aa0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
29ab0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c  nRowLogEst = sql
29ac0 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d  ite3LogEst(pSub-
29ad0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
29ae0 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
29af0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
29b00 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
29b10 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
29b20 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
29b30 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
29b40 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
29b50 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
29b60 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
29b70 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
29b80 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
29b90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
29ba0 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
29bb0 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
29bc0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
29bd0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
29be0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
29bf0 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45  if( /*pParse->nE
29c00 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c  rr ||*/ db->mall
29c10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
29c20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
29c30 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
29c40 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
29c50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
29c60 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
29c70 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
29c80 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  rc;.    if( !Ign
29c90 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
29ca0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
29cb0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
29cc0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
29cd0 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
29ce0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64   p->pEList;.#end
29cf0 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  if.  pWhere = p-
29d00 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
29d10 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
29d20 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
29d30 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
29d40 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
29d50 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
29d60 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
29d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29d80 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
29d90 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
29da0 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
29db0 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
29dc0 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
29dd0 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
29de0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
29df0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
29e00 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
29e10 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
29e20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
29e30 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
29e40 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
29e50 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75  ectId);.    retu
29e60 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
29e70 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  f..  /* If the q
29e80 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
29e90 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
29ea0 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
29eb0 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
29ec0 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
29ed0 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
29ee0 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
29ef0 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
29f00 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
29f10 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
29f20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
29f30 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
29f40 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
29f50 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
29f60 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
29f70 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
29f80 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
29f90 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
29fa0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
29fb0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
29fc0 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
29fd0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
29fe0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
29ff0 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
2a000 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
2a010 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
2a020 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
2a030 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
2a040 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
2a050 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
2a060 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
2a070 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
2a080 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
2a090 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
2a0a0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
2a0b0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
2a0c0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
2a0d0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
2a0e0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
2a0f0 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
2a100 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2a110 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
2a120 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
2a130 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
2a140 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a150 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
2a160 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73  rderBy, p->pELis
2a170 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20  t, -1)==0.  ){. 
2a180 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
2a190 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
2a1a0 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20      p->pGroupBy 
2a1b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2a1c0 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
2a1d0 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f  st, 0);.    pGro
2a1e0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2a1f0 42 79 3b 0a 20 20 20 20 73 53 6f 72 74 2e 70 4f  By;.    sSort.pO
2a200 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2a210 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2a220 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2a230 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2a240 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2a250 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2a260 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2a270 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2a280 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2a290 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2a2a0 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2a2b0 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2a2c0 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2a2d0 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2a2e0 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2a2f0 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2a300 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2a310 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2a320 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2a330 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
2a340 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
2a350 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
2a360 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
2a370 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
2a380 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
2a390 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2a3a0 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
2a3b0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2a3c0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
2a3d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
2a3e0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
2a3f0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2a400 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
2a410 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
2a420 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
2a430 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
2a440 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
2a450 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
2a460 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2a470 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
2a480 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2a490 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2a4a0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2a4b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2a4c0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2a4d0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2a4e0 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2a4f0 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
2a500 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2a510 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2a520 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
2a530 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
2a540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a550 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2a560 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2a570 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
2a580 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
2a590 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
2a5a0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
2a5b0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2a5c0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2a5d0 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
2a5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
2a5f0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2a600 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
2a610 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2a620 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
2a630 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2a640 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
2a650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
2a660 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
2a670 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
2a680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a690 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2a6a0 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
2a6b0 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
2a6c0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
2a6d0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
2a6e0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
2a6f0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2a700 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
2a710 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
2a720 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
2a730 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
2a740 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
2a750 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
2a760 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
2a770 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
2a780 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2a790 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e  eGetOp(v, sSort.
2a7a0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
2a7b0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
2a7c0 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72  erOpen;.    sSor
2a7d0 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
2a7e0 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
2a7f0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
2a800 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
2a810 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2a820 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2a830 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2a840 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2a850 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2a860 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2a870 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2a880 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2a890 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2a8a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2a8b0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a8e0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2a8f0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a910 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2a920 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2a930 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2a940 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a960 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2a970 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2a980 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2a990 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2a9a0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2a9b0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2a9c0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2a9d0 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2a9e0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2a9f0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2aa00 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2aa10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2aa20 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2aa30 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2aa40 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2aa50 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2aa60 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2aa70 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2aa80 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2aa90 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2aaa0 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2aab0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2aac0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2aad0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2aae0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2aaf0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2ab00 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2ab10 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2ab40 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2ab50 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2ab60 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2ab70 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2ab80 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2ab90 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2aba0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2abb0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2abc0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2abd0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2abe0 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2abf0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2ac00 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2ac10 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2ac20 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2ac30 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2ac40 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2ac50 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2ac60 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2ac70 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2ac80 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2ac90 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2aca0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2acb0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2acc0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2acd0 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2ace0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2acf0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2ad00 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2ad10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2ad20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2ad30 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2ad40 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2ad50 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2ad60 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2ad70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2ad80 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2ad90 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2ada0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2adb0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2adc0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2add0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ade0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2adf0 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2ae00 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2ae10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ae20 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2ae30 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2ae40 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2ae50 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2ae60 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2ae70 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2ae80 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2ae90 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2aea0 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2aeb0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2aed0 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2aee0 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2aef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af00 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2af10 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2af20 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2af30 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2af40 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2af50 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2af60 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2af70 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2af80 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2af90 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2afa0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2afb0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2afc0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2afd0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2afe0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2aff0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2b000 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2b010 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2b020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2b030 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2b040 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2b050 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2b060 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2b070 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2b080 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2b090 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2b0a0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2b0b0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2b0c0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2b0d0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2b0e0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2b0f0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2b100 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2b110 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2b120 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2b130 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2b140 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b160 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2b170 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2b180 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2b190 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2b1a0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2b1b0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2b1c0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2b1d0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2b1e0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2b1f0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2b200 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2b210 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2b220 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2b230 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2b240 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2b250 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2b260 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2b270 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2b280 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2b290 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2b2a0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2b2b0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2b2c0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2b2d0 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2b2e0 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2b2f0 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2b300 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2b310 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2b320 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2b330 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2b340 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2b350 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2b360 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2b370 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2b380 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2b390 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2b3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2b3c0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2b3d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2b3e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2b3f0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2b400 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2b410 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2b420 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2b430 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2b440 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2b450 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2b460 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2b470 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2b480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b490 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2b4a0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2b4b0 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2b4c0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2b4d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2b4e0 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2b4f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2b500 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2b510 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2b520 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2b530 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2b540 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2b550 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2b560 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2b570 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2b580 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2b590 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2b5a0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2b5b0 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2b5c0 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2b5d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2b5e0 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2b5f0 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2b600 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2b610 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2b620 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2b630 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2b640 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2b650 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2b660 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2b670 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2b680 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2b690 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2b6a0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2b6b0 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2b6c0 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2b6d0 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2b6e0 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2b6f0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2b700 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2b710 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2b720 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2b730 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2b740 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2b750 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2b760 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2b770 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2b780 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2b790 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2b7a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2b7b0 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2b7c0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2b7d0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2b7e0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2b7f0 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2b800 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2b810 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2b820 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2b830 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2b840 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2b850 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2b860 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2b870 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2b880 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2b890 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2b8a0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2b8b0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2b8c0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2b8d0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2b8e0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2b8f0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2b900 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2b910 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2b920 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2b930 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2b940 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2b950 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2b960 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2b970 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2b980 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2b990 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2b9a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2b9b0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2b9c0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2b9d0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2b9e0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2b9f0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2ba00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ba10 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2ba20 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2ba30 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2ba40 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2ba50 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ba60 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2ba70 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2ba80 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2ba90 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2baa0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2bab0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2bac0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2bad0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2bae0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2baf0 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2bb00 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2bb10 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2bb20 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2bb30 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2bb40 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2bb50 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2bb60 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2bb70 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2bb80 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2bb90 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2bba0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2bbb0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2bbc0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2bbd0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2bbe0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2bbf0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2bc00 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2bc10 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2bc20 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2bc30 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2bc40 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2bc50 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2bc60 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2bc70 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2bc80 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2bc90 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2bca0 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2bcb0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2bcc0 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2bcd0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2bce0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2bcf0 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2bd00 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2bd10 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2bd20 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2bd30 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2bd40 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2bd50 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2bd60 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2bd70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2bd80 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2bd90 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2bda0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2bdb0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2bdc0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2bdd0 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2bde0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2bdf0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2be00 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2be10 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2be20 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2be30 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2be40 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2be50 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2be60 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2be70 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2be80 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2be90 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2bea0 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2beb0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2bec0 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2bed0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2bee0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2bef0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2bf00 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2bf10 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2bf20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2bf30 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2bf40 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2bf50 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2bf60 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2bf70 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2bf80 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2bf90 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2bfa0 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2bfb0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2bfc0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2bfd0 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2bfe0 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2bff0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2c000 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2c010 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2c020 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2c030 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2c040 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2c050 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2c060 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c070 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2c080 47 72 6f 75 70 42 79 2c 20 30 2c 20 30 29 3b 0a  GroupBy, 0, 0);.
2c090 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
2c0a0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
2c0b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
2c0c0 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20  orterOpen, .    
2c0d0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2c0e0 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49  ortingIdx, sAggI
2c0f0 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
2c100 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30  mn, .          0
2c110 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
2c120 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2c130 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
2c140 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
2c150 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
2c160 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
2c170 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
2c180 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
2c190 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2c1a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
2c1b0 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
2c1c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
2c1d0 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
2c1e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c1f0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2c200 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
2c210 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2c220 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
2c230 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2c240 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
2c250 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2c260 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
2c270 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
2c280 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2c290 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2c2a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2c2b0 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
2c2c0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2c2d0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2c2e0 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2c2f0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
2c300 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2c310 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2c320 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
2c330 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c340 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
2c350 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2c360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c370 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2c380 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
2c390 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c3a0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
2c3b0 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
2c3c0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2c3d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2c3e0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
2c3f0 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
2c400 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
2c410 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
2c420 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
2c430 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
2c440 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
2c450 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
2c460 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
2c470 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
2c480 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
2c490 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
2c4a0 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
2c4b0 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
2c4c0 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
2c4d0 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
2c4e0 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
2c4f0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
2c500 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
2c510 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
2c520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2c530 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c540 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2c550 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2c560 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
2c570 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2c580 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2c590 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
2c5a0 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20  roupBy, 0,.     
2c5b0 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2c5c0 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70  BY | (orderByGrp
2c5d0 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   ? WHERE_SORTBYG
2c5e0 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20  ROUP : 0), 0.   
2c5f0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
2c600 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2c610 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2c620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2c630 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2c640 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e  nfo)==pGroupBy->
2c650 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2c660 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2c670 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2c680 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2c690 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2c6a0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2c6b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2c6c0 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2c6d0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2c6e0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2c6f0 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2c700 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2c710 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2c720 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2c730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2c740 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2c750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c760 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2c770 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2c780 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2c790 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2c7a0 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2c7b0 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2c7c0 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2c7d0 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2c7e0 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2c7f0 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2c800 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2c810 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2c820 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2c830 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2c840 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2c850 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2c860 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2c870 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2c880 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2c890 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2c8a0 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2c8b0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2c8c0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2c8d0 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2c8e0 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2c8f0 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2c900 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c920 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2c930 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2c940 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2c950 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2c960 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2c970 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2c980 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b  nCol = nGroupBy;
2c990 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2c9a0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2c9b0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2c9c0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2c9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2c9e0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2c9f0 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  .iSorterColumn>=
2ca00 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2ca10 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   nCol++;.       
2ca20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2ca30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ca40 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20          regBase 
2ca50 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2ca60 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
2ca70 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2ca80 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2ca90 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2caa0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2cab0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2cac0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65  se, pGroupBy, re
2cad0 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20  gBase, 0);.     
2cae0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
2caf0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2cb00 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
2cb10 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
2cb20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
2cb30 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
2cb40 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
2cb50 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
2cb60 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
2cb70 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2cb80 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
2cb90 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
2cba0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32            int r2
2cbb0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
2cbc0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
2cbd0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61  odeGetColumn(pPa
2cbe0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc00 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c       pCol->pTab,
2cc10 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20   pCol->iColumn, 
2cc20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31  pCol->iTable, r1
2cc30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2cc40 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a    if( r1!=r2 ){.
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cc60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2cc70 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c  v, OP_SCopy, r2,
2cc80 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
2cc90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2cca0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2ccb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ccc0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
2ccd0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
2cce0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2ccf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cd00 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
2cd10 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
2cd20 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
2cd30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cd40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2cd50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
2cd60 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2cd70 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
2cd80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2cd90 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
2cda0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
2cdb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2cdc0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2cdd0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
2cde0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2cdf0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2ce00 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2ce10 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2ce20 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
2ce30 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
2ce40 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
2ce50 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
2ce60 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2ce70 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2ce80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2ce90 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
2cea0 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
2ceb0 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
2cec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ced0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2cee0 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
2cef0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2cf00 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
2cf10 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2cf20 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
2cf30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2cf40 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
2cf50 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
2cf60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
2cf70 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2cf80 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
2cf90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2cfa0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
2cfb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
2cfc0 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
2cfd0 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
2cfe0 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
2cff0 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
2d000 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
2d010 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
2d020 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
2d030 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
2d040 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2d050 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
2d060 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
2d070 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
2d080 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
2d090 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
2d0a0 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
2d0b0 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
2d0c0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
2d0d0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
2d0e0 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
2d0f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
2d100 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
2d110 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
2d120 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
2d130 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
2d140 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
2d150 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
2d160 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2d170 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
2d180 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
2d190 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
2d1a0 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
2d1b0 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
2d1c0 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
2d1d0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
2d1e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2d1f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2d200 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
2d210 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
2d220 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
2d230 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
2d240 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2d250 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
2d260 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
2d270 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
2d280 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
2d290 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
2d2a0 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
2d2b0 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
2d2c0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
2d2d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2d2e0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
2d2f0 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
2d300 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
2d310 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
2d320 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
2d330 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
2d340 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
2d350 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
2d360 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
2d370 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2d380 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d390 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2d3a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
2d3b0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2d3c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d3d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d3e0 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
2d3f0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2d400 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20   sortOut);.     
2d410 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2d420 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
2d430 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
2d440 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2d450 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
2d460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d470 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
2d480 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
2d490 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  em+j);.         
2d4a0 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69   if( j==0 ) sqli
2d4b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2d4c0 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
2d4d0 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
2d4e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d4f0 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
2d500 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2d510 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2d520 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
2d530 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
2d540 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2d550 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d570 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
2d580 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
2d590 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2d5a0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2d5c0 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
2d5d0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
2d5e0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2d5f0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
2d600 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2d610 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2d620 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2d630 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
2d640 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65   j1+1); VdbeCove
2d650 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
2d660 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2d670 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
2d680 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
2d690 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
2d6a0 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
2d6b0 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
2d6c0 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
2d6d0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
2d6e0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
2d6f0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
2d700 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
2d710 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
2d720 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2d730 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
2d740 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
2d750 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
2d760 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
2d770 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
2d780 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
2d790 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
2d7a0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
2d7b0 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
2d7c0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2d7d0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2d7e0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
2d7f0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
2d800 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
2d810 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
2d820 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2d830 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
2d840 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
2d850 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
2d860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2d880 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2d890 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2d8a0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2d8b0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2d8c0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
2d8d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d8e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
2d8f0 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
2d900 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  ddrEnd); VdbeCov
2d910 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2d920 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d930 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
2d940 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2d950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d960 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2d970 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2d980 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2d990 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
2d9a0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2d9b0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2d9c0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2d9d0 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
2d9e0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
2d9f0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
2da00 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
2da10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2da20 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2da30 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61   j1);.      upda
2da40 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2da50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2da60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2da70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2da80 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
2da90 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2daa0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
2dab0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
2dac0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2dad0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2dae0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
2daf0 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
2db00 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2db10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2db20 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2db30 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
2db40 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2db50 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
2db60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2db70 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
2db80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2db90 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2dba0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dbb0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
2dbc0 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
2dbd0 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
2dbe0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2dbf0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
2dc00 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
2dc10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2dc20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2dc30 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2dc40 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2dc50 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2dc60 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2dc70 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
2dc80 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
2dc90 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
2dca0 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
2dcb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2dcc0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
2dcd0 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20   0, addrEnd);.. 
2dce0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2dcf0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
2dd00 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
2dd10 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2dd20 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2dd30 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
2dd40 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
2dd50 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
2dd60 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
2dd70 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
2dd80 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
2dd90 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
2dda0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2ddb0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
2ddc0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
2ddd0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
2dde0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
2ddf0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
2de00 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
2de10 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
2de20 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
2de30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
2de40 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
2de50 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
2de60 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
2de70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2de80 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
2de90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2dea0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2deb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2dec0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2ded0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
2dee0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2def0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
2df00 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
2df10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2df20 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2df30 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
2df40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2df50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2df60 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
2df70 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2df80 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2df90 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2dfa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2dfb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2dfc0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
2dfd0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
2dfe0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2dff0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
2e000 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
2e010 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
2e020 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
2e030 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2e040 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2e050 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2e060 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
2e070 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2e080 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
2e090 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2e0a0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2e0b0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
2e0c0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
2e0d0 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
2e0e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2e0f0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2e100 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2e110 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  t, -1, &sSort,. 
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e130 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
2e140 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
2e160 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
2e170 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
2e180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e190 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2e1a0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2e1b0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e1c0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
2e1d0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
2e1e0 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
2e1f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2e200 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2e210 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
2e220 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
2e230 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
2e240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2e250 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2e260 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2e270 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2e280 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2e290 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
2e2a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2e2b0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
2e2c0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
2e2d0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
2e2e0 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
2e2f0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
2e300 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
2e310 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
2e320 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
2e330 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
2e340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
2e350 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
2e360 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
2e370 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
2e380 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
2e390 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
2e3a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
2e3b0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
2e3c0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
2e3d0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
2e3e0 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
2e3f0 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
2e400 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
2e410 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
2e420 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
2e430 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2e440 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
2e450 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2e460 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
2e470 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
2e480 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
2e490 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
2e4a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2e4b0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
2e4c0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
2e4d0 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
2e4e0 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
2e4f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
2e500 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
2e510 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
2e520 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
2e530 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
2e540 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
2e550 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
2e560 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
2e570 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
2e580 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
2e590 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
2e5a0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
2e5b0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
2e5c0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
2e5d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
2e5e0 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
2e5f0 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
2e600 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
2e610 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
2e620 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e630 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
2e640 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2e650 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
2e660 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2e670 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
2e680 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
2e690 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
2e6a0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
2e6b0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
2e6c0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6e0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2e6f0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2e700 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
2e710 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
2e720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
2e730 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
2e740 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
2e750 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
2e760 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e770 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
2e780 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
2e790 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
2e7a0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
2e7b0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
2e7c0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2e7d0 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
2e7e0 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
2e7f0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2e800 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
2e810 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
2e820 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
2e830 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
2e840 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
2e850 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
2e860 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
2e870 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
2e880 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
2e890 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
2e8a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
2e8b0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
2e8c0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
2e8d0 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
2e8e0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2e8f0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
2e900 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
2e910 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
2e920 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
2e930 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
2e940 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
2e950 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
2e960 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
2e970 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
2e980 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
2e990 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
2e9a0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
2e9b0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
2e9c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2e9d0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2e9e0 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
2e9f0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
2ea00 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
2ea10 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
2ea20 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
2ea30 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
2ea40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ea50 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
2ea60 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2ea70 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
2ea80 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
2ea90 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
2eaa0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
2eab0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
2eac0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
2ead0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
2eae0 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
2eaf0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2eb00 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
2eb10 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
2eb20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2eb30 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
2eb40 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
2eb50 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
2eb60 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
2eb70 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
2eb80 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
2eb90 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
2eba0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2ebb0 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
2ebc0 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
2ebd0 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
2ebe0 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
2ebf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2ec00 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
2ec10 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
2ec20 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
2ec30 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
2ec40 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
2ec50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ec60 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
2ec70 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
2ec80 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2ec90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2eca0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ecb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
2ecc0 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
2ecd0 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
2ece0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ecf0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2ed00 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
2ed10 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2ed20 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
2ed30 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
2ed40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
2ed50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2ed60 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
2ed70 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
2ed80 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2ed90 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
2eda0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2edb0 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
2edc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2edd0 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
2ede0 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
2edf0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
2ee00 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
2ee10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2ee20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2ee30 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
2ee40 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
2ee50 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
2ee60 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
2ee70 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
2ee80 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
2ee90 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
2eea0 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
2eeb0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
2eec0 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
2eed0 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
2eee0 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
2eef0 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
2ef00 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
2ef10 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
2ef20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
2ef30 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
2ef40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
2ef50 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
2ef60 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
2ef70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
2ef80 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
2ef90 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
2efa0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
2efb0 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
2efc0 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
2efd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
2efe0 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
2eff0 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
2f000 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2f010 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
2f020 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
2f030 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
2f040 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
2f050 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
2f060 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
2f070 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
2f080 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f090 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
2f0a0 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
2f0b0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
2f0c0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
2f0d0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
2f0e0 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
2f0f0 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
2f100 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
2f110 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
2f120 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
2f130 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
2f140 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
2f150 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
2f160 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
2f170 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
2f180 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
2f190 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
2f1a0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
2f1b0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
2f1c0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
2f1d0 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
2f1e0 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
2f1f0 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
2f200 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
2f210 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
2f220 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
2f230 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
2f240 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
2f250 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
2f260 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
2f270 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
2f280 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
2f290 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
2f2a0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
2f2b0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
2f2c0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
2f2d0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
2f2e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2f2f0 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
2f300 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
2f310 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
2f320 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
2f330 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
2f340 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
2f350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f360 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
2f370 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
2f380 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
2f390 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
2f3a0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
2f3b0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
2f3c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2f3d0 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
2f3e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2f3f0 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
2f400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
2f410 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61  inMax && !db->ma
2f420 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
2f430 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
2f440 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  x->a[0].sortOrde
2f450 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f  r = flag!=WHERE_
2f460 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30  ORDERBY_MIN ?1:0
2f470 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
2f480 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70  inMax->a[0].pExp
2f490 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
2f4a0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  N;.          }. 
2f4b0 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
2f4c0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
2f4d0 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67   runs if the agg
2f4e0 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52  regate has no GR
2f4f0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
2f500 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
2f510 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63  rocessing is muc
2f520 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20  h simpler since 
2f530 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
2f540 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
2f550 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e     ** of output.
2f560 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2f570 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
2f580 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2f590 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
2f5a0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2f5b0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2f5c0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2f5d0 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c  here, pMinMax,0,
2f5e0 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20  flag,0);.       
2f5f0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
2f600 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2f610 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2f620 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
2f630 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
2f640 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
2f650 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
2f660 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2f670 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2f680 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f690 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d  pMinMax==0 || pM
2f6a0 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20  inMax->nExpr==1 
2f6b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2f6c0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
2f6d0 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29  ered(pWInfo)>0 )
2f6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2f6f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2f700 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
2f710 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
2f720 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
2f730 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2f740 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
2f750 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
2f760 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
2f770 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2f780 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
2f790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f7a0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2f7b0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2f7c0 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
2f7d0 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
2f7e0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2f7f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f      }..      sSo
2f800 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2f810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f820 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2f830 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
2f840 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
2f850 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2f860 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2f870 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2f880 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
2f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8a0 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
2f8b0 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
2f8c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f8d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2f8e0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
2f8f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2f900 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
2f910 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
2f920 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
2f930 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
2f940 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2f950 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
2f960 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
2f970 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
2f980 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
2f990 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
2f9a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
2f9b0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
2f9c0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
2f9d0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
2f9e0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
2f9f0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
2fa00 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
2fa10 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
2fa20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2fa30 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
2fa40 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2fa50 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f  sSort.nOBSat>0 ?
2fa60 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20   "RIGHT PART OF 
2fa70 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52  ORDER BY":"ORDER
2fa80 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
2fa90 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
2faa0 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70  se, p, &sSort, p
2fab0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
2fac0 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
2fad0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
2fae0 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
2faf0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
2fb00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
2fb10 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
2fb20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
2fb30 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
2fb40 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
2fb50 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
2fb60 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
2fb70 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
2fb80 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
2fb90 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
2fba0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
2fbb0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
2fbc0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
2fbd0 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
2fbe0 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
2fbf0 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
2fc00 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  :.  explainSetIn
2fc10 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
2fc20 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
2fc30 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f  eSelectId);..  /
2fc40 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
2fc50 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
2fc60 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
2fc70 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
2fc80 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
2fc90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2fca0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2fcb0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
2fcc0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
2fcd0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
2fce0 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
2fcf0 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
2fd00 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
2fd10 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
2fd20 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
2fd30 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
2fd40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
2fd50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2fd60 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
2fd70 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
2fd80 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
2fd90 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ble description 
2fda0 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74 20  of a the Select 
2fdb0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
2fdc0 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
2fdd0 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  eSelect(Vdbe *pV
2fde0 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
2fdf0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2fe00 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2fe10 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28  SELECT ");.  if(
2fe20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
2fe30 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
2fe40 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
2fe50 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2fe60 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
2fe70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2fe80 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2fe90 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29  be, "DISTINCT ")
2fea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2feb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2fec0 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
2fed0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2fee0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2fef0 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20  "agg_flag ");.  
2ff00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
2ff10 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2ff20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ff30 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ff40 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73   "   ");.  }.  s
2ff50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
2ff60 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
2ff70 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
2ff80 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2ff90 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  e);.  if( p->pSr
2ffa0 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53  c && p->pSrc->nS
2ffb0 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rc ){.    int i;
2ffc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2ffd0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2ffe0 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73   "FROM ");.    s
2fff0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
30000 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f  h(pVdbe);.    fo
30010 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
30020 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
30030 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
30040 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
30050 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
30060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
30070 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30080 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20  e, "{%d,*} = ", 
30090 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
300a0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
300b0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
300c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
300d0 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c  ainSelect(pVdbe,
300e0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
300f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
30100 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
30110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
30120 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30130 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73  e, " (tabname=%s
30140 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
30150 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
30160 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
30170 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
30180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30190 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
301a0 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74  pVdbe, "%s", pIt
301b0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
301c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
301d0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
301e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
301f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30200 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20 70  e, " (AS %s)", p
30210 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
30220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30230 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
30240 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20   & JT_LEFT ){.  
30250 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
30260 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
30270 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b  , " LEFT-JOIN");
30280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
30290 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
302a0 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pVdbe);.    }.  
302b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
302c0 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  Pop(pVdbe);.  }.
302d0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
302e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
302f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30300 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20  e, "WHERE ");.  
30310 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30320 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
30330 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
30340 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
30350 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
30360 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
30370 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30380 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47  Printf(pVdbe, "G
30390 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73  ROUPBY ");.    s
303a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
303b0 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
303c0 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
303d0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
303e0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
303f0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
30400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
30410 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
30420 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20  "HAVING ");.    
30430 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
30440 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61  pr(pVdbe, p->pHa
30450 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
30460 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
30470 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
30480 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
30490 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
304a0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52  rintf(pVdbe, "OR
304b0 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71  DERBY ");.    sq
304c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
304d0 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
304e0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
304f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
30500 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
30510 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
30520 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
30530 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c  Printf(pVdbe, "L
30540 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  IMIT ");.    sql
30550 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
30560 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  pVdbe, p->pLimit
30570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
30580 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
30590 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66    }.  if( p->pOf
305a0 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  fset ){.    sqli
305b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
305c0 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20  (pVdbe, "OFFSET 
305d0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
305e0 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
305f0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
30600 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
30610 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
30620 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
30630 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65  plainSelect(Vdbe
30640 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20   *pVdbe, Select 
30650 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
30660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
30670 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
30680 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74  e, "(null-select
30690 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
306a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
306b0 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29  plainPush(pVdbe)
306c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
306d0 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65      explainOneSe
306e0 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b 0a  lect(pVdbe, p);.
306f0 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
30700 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
30710 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
30720 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
30730 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  be);.    sqlite3
30740 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
30750 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65 6c  dbe, "%s\n", sel
30760 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
30770 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
30780 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
30790 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20 73  dbe, "END");.  s
307a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
307b0 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20 45  (pVdbe);.}../* E
307c0 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
307d0 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
307e0 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
307f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30830 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
30840 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
30850 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
30860 41 49 4e 29 20 2a 2f 0a                          AIN) */.