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

Artifact 7bb5c6334128877a30d4644fb948098a3ec41bbc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0ee0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
0ef0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0f00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65  ailed );.    pNe
0f10: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0f20: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
0f30: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
0f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69  ;.  }.  if( pELi
0f50: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c  st==0 ){.    pEL
0f60: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
0f70: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
0f80: 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
0f90: 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29  pr(db,TK_ALL,0))
0fa0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45  ;.  }.  pNew->pE
0fb0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
0fc0: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70   if( pSrc==0 ) p
0fd0: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
0fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0ff0: 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20  zeof(*pSrc));.  
1000: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
1010: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
1020: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
1030: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
1040: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
1050: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
1060: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
1070: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1080: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
1090: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
10a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
10b0: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  LECT;.  pNew->pL
10c0: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10d0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
10e0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65   pOffset;.  asse
10f0: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
1100: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70  | pLimit!=0 || p
1110: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
1120: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1130: 64 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  d!=0 );.  pNew->
1140: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
1150: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
1160: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
1170: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1180: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1190: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
11a0: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
11b0: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
11c0: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
11d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
11e0: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
11f0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1200: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
1210: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
1220: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1230: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
1240: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
1250: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
1260: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1270: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1280: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1290: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
12a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
12b0: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
12c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12d0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
12e0: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
12f0: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1300: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
1310: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
1320: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
1330: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1340: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1350: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1360: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1370: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1380: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1390: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
13a0: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
13b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
13c0: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
13d0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
13e0: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
13f0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1400: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1410: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1420: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1430: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
1440: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1450: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
1460: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
1470: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
1480: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
1490: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
14a0: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
14b0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
14c0: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
14d0: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
14e0: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
14f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1500: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1510: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1520: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1530: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
1540: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
1550: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
1560: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
1570: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
1580: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
1590: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
15a0: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
15b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
15c0: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
15d0: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
15e0: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
15f0: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1600: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1610: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1620: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1630: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1640: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
1650: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1660: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
1670: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
1680: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1690: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
16a0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
16d0: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1700: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1710: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1720: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1730: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
1740: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1750: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
1760: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
1770: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
1780: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
1790: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
17a0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
17b0: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
17c0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
17d0: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
17e0: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
17f0: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1800: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1810: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1820: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1840: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
1850: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
1860: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
1870: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
1880: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
1890: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
18b0: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
18c0: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
18d0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
18e0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
18f0: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1900: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1910: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1920: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1930: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1940: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1950: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1960: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1970: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1980: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1990: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
19a0: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
19b0: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
19c0: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
19d0: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
19e0: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
19f0: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1a00: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1a10: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1a20: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1a30: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1a40: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1a50: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1a60: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1a70: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1a80: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1a90: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1ab0: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1ac0: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1af0: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1b00: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1b10: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1b20: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1b30: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1b40: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1b50: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1b60: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b80: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1b90: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1ba0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1bb0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bc0: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1bd0: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1be0: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1bf0: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1c00: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1c10: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1c20: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1c30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1c40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c50: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1c60: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1c70: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1c80: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1c90: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1ca0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1cb0: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1cc0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1cd0: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1ce0: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1cf0: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1d00: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1d20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1d30: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1d40: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1d50: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1d60: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1d70: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1d80: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1d90: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1db0: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1dc0: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1dd0: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1de0: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1df0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1e00: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1e10: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1e20: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1e30: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1e40: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1e50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1e60: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1e70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1e80: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1e90: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
1ea0: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
1ed0: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
1ee0: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
1ef0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
1f00: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
1f10: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
1f20: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
1f30: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
1f40: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
1f50: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
1f60: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
1f70: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
1f80: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
1f90: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
1fa0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
1fb0: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
1fc0: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
1fd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
1fe0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
1ff0: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2000: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2010: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2020: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2030: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
2050: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
2060: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
2070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2080: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
2090: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
20a0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
20b0: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
20c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20d0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
20e0: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
20f0: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2100: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2110: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2120: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2130: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
2140: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2150: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2160: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
2170: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2180: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
2190: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
21a0: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
21b0: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
21c0: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
21d0: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
21e0: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
21f0: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2200: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2210: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2220: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2230: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
2240: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
2250: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
2260: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
2270: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
2280: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
2290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22d0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22e0: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
22f0: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2300: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2310: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2320: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2330: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
2340: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
2350: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
2360: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
2370: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
2380: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
2390: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
23a0: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
23b0: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
23c0: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
23d0: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
23e0: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
23f0: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2400: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2410: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2420: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2430: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
2440: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
2450: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
2460: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
2470: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2490: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
24b0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
24c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
24d0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
24e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
24f0: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2520: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2530: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2540: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2560: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2570: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
2580: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25b0: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
25c0: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
25d0: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
25e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25f0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2600: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2610: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2620: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2630: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2640: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
2650: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
2660: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
2670: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2680: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
2690: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
26a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26c0: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
26d0: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
26e0: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
26f0: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2710: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2730: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
2740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2750: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
2760: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
2770: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
2780: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2790: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
27a0: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
27b0: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
27c0: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
27d0: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
27e0: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
27f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2800: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20 30  _EQ, pE1, pE2, 0
2810: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2820: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2830: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2840: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2850: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2860: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2870: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2880: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2890: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
28a0: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
28b0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
28c0: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
28d0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
28e0: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
28f0: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2900: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2910: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2920: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2930: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2940: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2950: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2960: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2970: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2980: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2990: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
29a0: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
29b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
29c0: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
29d0: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
29e0: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
29f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2a00: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2a10: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2a20: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2a30: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2a40: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2a50: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2a60: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2a70: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2a80: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2a90: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2aa0: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2ab0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2ac0: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2ad0: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2ae0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2af0: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2b00: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2b10: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2b20: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2b30: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2b40: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2b50: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2b60: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
2b70: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
2b80: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
2b90: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
2ba0: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
2bb0: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
2bc0: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
2bd0: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
2be0: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
2bf0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2c00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
2c10: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
2c20: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
2c30: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
2c40: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2c50: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
2c60: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
2c70: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
2c80: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
2c90: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
2ca0: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2cb0: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
2cc0: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
2cd0: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
2ce0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
2cf0: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
2d00: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
2d10: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
2d20: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
2d30: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
2d40: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2d50: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
2d60: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
2d70: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
2d80: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
2d90: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
2da0: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
2db0: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
2dc0: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
2dd0: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
2de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2df0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
2e00: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
2e10: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
2e20: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2e30: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
2e40: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2e50: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2e60: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
2e70: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2e80: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
2e90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
2ea0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
2eb0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2ec0: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
2ed0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2ee0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2ef0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2f00: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2f10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f20: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2f30: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2f40: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2f50: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2f60: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2f70: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2f80: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2f90: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2fa0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
2fb0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
2fc0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
2fd0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
2fe0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
2ff0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
3000: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
3010: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
3020: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
3030: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
3040: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
3050: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
3060: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
3070: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
3080: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
3090: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
30a0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
30b0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
30c0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
30d0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
30e0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
30f0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
3100: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
3110: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
3120: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
3130: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3140: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
3150: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
3160: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
3170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3180: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
3190: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
31a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
31b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
31c0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
31d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
31e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
31f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3210: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
3220: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
3230: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3260: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
3270: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
3280: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
3290: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
32a0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
32b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
32c0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
32d0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
32e0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
32f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
3300: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
3310: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
3320: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
3330: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
3340: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
3350: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
3360: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
3370: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
3380: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3390: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
33a0: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
33b0: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
33c0: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
33d0: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
33e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
33f0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
3400: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
3410: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3420: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3430: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3440: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3450: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3460: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3470: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3480: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3490: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
34a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
34b0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
34c0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
34d0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
34e0: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
34f0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3500: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3510: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
3520: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
3530: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
3540: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
3550: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
3560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3580: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3590: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
35a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
35b0: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
35c0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
35d0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
35e0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
35f0: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3600: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
3610: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3620: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
3630: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
3640: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
3650: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3660: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3670: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3680: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3690: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
36a0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
36b0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
36c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
36d0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
36e0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
36f0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
3720: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
3730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3740: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3750: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
3760: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3770: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3790: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
37a0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
37b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
37c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
37d0: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
37e0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
37f0: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3800: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3810: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
3820: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
3830: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
3840: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3850: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3860: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3870: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3880: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3890: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
38a0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
38b0: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
38c0: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
38d0: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
38e0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
38f0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3900: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3910: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3920: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3930: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3940: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3950: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3960: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3970: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3980: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3990: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
39a0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
39b0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
39c0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
39d0: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
39e0: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
39f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3a00: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3a10: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3a20: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3a30: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3a40: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3a50: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3a60: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3a70: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3a80: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3a90: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3aa0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3ab0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3ac0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3ad0: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3ae0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3af0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3b00: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3b10: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3b20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3b30: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3b40: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3b50: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3b60: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3b70: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3b80: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3b90: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3ba0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3bb0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3bc0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3bd0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3be0: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3bf0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3c00: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3c10: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3c20: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3c30: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3c40: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3c50: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3c60: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3c70: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3c80: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3c90: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3ca0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3cb0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3cc0: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3cd0: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3ce0: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3cf0: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3d00: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3d10: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3d20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3d30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3d40: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3d50: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3d60: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3d80: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3d90: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3da0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3db0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3dc0: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3dd0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3de0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3df0: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3e00: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3e10: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3e20: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3e40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3e50: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3e60: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3e70: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
3e80: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
3e90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3ea0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3eb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3ec0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
3ed0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
3ee0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
3ef0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
3f00: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
3f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
3f20: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
3f30: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
3f40: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
3f50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3f60: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
3f70: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
3f80: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
3f90: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
3fa0: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
3fb0: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
3fc0: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
3fd0: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
3fe0: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
3ff0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
4000: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
4010: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
4020: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
4030: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
4040: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
4050: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
4060: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4070: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4080: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4090: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
40a0: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
40b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
40c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
40d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
40e0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
40f0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
4100: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
4110: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
4120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4130: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
4140: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4150: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4170: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4180: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4190: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
41a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
41b0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
41e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
41f0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4200: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4210: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4220: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4230: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4240: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4260: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4270: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4280: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4290: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42b0: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
42c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
42d0: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
4310: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4320: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
4330: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4350: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4360: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4370: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4380: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43a0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
43b0: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
43c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
43f0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
4400: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
4410: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4420: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
4430: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29  if( nPrefixReg )
4440: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
4450: 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b  refixReg==nExpr+
4460: 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42  bSeq );.    regB
4470: 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20  ase = regData - 
4480: 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20  nExpr - bSeq;.  
4490: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
44a0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
44b0: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
44c0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
44d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
44e0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
44f0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
4500: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
4510: 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
4520: 50 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  P);.  if( bSeq )
4530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4540: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4550: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4560: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4570: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4580: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
45a0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
45b0: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
45c0: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
45d0: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20   nData);.  }..  
45e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4600: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4610: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4620: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4630: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4640: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4650: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4660: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4670: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4680: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4690: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
46a0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
46b0: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
46c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
46d0: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
46e0: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
46f0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4700: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4710: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4720: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4730: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4740: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4750: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4760: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4770: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4780: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4790: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
47a0: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
47b0: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
47c0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
47d0: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
47e0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
47f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4800: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4810: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4820: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4830: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4840: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4850: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4860: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4870: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4880: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4890: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
48a0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
48b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
48c0: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
48d0: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
48e0: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
48f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4910: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4920: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4930: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4940: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4950: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4960: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4970: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4980: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4990: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
49a0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
49b0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
49c0: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
49d0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
49e0: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
49f0: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4a00: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4a10: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4a20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4a30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4a40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4a50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4a70: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4a80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4a90: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4aa0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4ab0: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4ac0: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4b00: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4b10: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4b20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4b30: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4b40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4b50: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4b60: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4b70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4b80: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4b90: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4ba0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4bb0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4bc0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4bd0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4be0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4bf0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4c00: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4c10: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4c30: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4c40: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4c50: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4c60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4c70: 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73  Here(v, addrFirs
4c80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4c90: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4ca0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67  se, regBase, reg
4cb0: 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  PrevKey, pSort->
4cc0: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c  nOBSat);.    sql
4cd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4ce0: 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20  (v, addrJmp);.  
4cf0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
4d00: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
4d10: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
4d20: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
4d30: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
4d40: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
4d50: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
4d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d70: 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  p2(v, op, pSort-
4d80: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
4d90: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65  cord);.  if( pSe
4da0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
4db0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4dc0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
4dd0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
4de0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
4df0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4e00: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
4e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
4e20: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4e30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
4e40: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4e50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4e60: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
4e70: 69 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62 65  it, 0, -1); Vdbe
4e80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ea0: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
4eb0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ed0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
4ee0: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4ef0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4f00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4f10: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
4f20: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
4f30: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
4f40: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
4f50: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
4f60: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
4f70: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
4f80: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
4f90: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
4fa0: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
4fb0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
4fc0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
4fd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
4fe0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
4ff0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5000: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5010: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5020: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
5030: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64 72  t addr;.    addr
5040: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5050: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp3(v, OP_IfNeg
5060: 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c 20 2d 31  , iOffset, 0, -1
5070: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5080: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5090: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50a0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
50b0: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
50c0: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
50d0: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
50e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
50f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5100: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5110: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
5120: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
5130: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
5140: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
5150: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
5160: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
5170: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
5180: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
5190: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
51a0: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
51b0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
51c0: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
51d0: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
51e0: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
51f0: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
5200: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
5210: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
5220: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
5230: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
5240: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
5250: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
5260: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
5270: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
52a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
52b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
52c0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
52d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
52e0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
52f0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
5300: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
5310: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
5320: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
5330: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
5340: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
5350: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
5360: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
5370: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5380: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
5390: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
53a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
53b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
53c0: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
53d0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
53e0: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
53f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5400: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
5410: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5420: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
5430: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
5440: 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72  m, N); VdbeCover
5450: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
5460: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5470: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
5480: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
5490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
54a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
54b0: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
54c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
54d0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
54e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
54f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5500: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5510: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5520: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
5530: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
5540: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
5550: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
5560: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
5570: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
5580: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
5590: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
55a0: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
55b0: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
55c0: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
55d0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
55e0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
55f0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
5600: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
5610: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
5620: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
5630: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5640: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
5650: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
5660: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
5670: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
5680: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
5690: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
56a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
56b0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
56c0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
56d0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
56e0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
56f0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
5700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5710: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5720: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
5730: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
5740: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5750: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
5760: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
5770: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5780: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
5790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
57a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
57b0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
57c0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
57d0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
57e0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
57f0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
5800: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
5810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
5830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
5840: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
5850: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
5860: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
5870: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
5880: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
5890: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
58a0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
58b0: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
58c0: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
58d0: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
58e0: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
58f0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
5900: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
5910: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
5920: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
5930: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
5940: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
5950: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5960: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
5970: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
5980: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59a0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
59b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
59d0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
59e0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
59f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5a00: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5a10: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5a20: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5a30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5a40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5a50: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5a60: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5a70: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5a80: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5a90: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5aa0: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5ab0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5ac0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5ad0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5ae0: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5af0: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5b00: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5b10: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5b20: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5b30: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5b40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5b50: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5b60: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5b70: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5b80: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5ba0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
5bb0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
5bc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5be0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
5bf0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
5c00: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
5c10: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5c20: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5c30: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
5c40: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
5c50: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
5c60: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
5c70: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
5c80: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
5c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
5ca0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
5cb0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
5cc0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
5cd0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
5ce0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5cf0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
5d00: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
5d10: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
5d20: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
5d30: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
5d40: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
5d50: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
5d60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5d70: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5d80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
5d90: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
5da0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5db0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
5dc0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
5dd0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
5de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
5df0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
5e00: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
5e10: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
5e20: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
5e30: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
5e40: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
5e50: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5e60: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
5e70: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
5e80: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
5e90: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
5ea0: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
5eb0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
5ec0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
5ed0: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
5ee0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
5ef0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
5f00: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
5f10: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
5f20: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
5f30: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
5f40: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
5f50: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
5f60: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
5f70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
5f80: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
5f90: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5fa0: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
5fb0: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
5fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
5fd0: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
5fe0: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
5ff0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
6000: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
6010: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
6020: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
6030: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
6040: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
6050: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
6060: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
6070: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
6080: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
6090: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
60a0: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
60b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
60c0: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
60d0: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
60e0: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
60f0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
6100: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
6110: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
6120: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
6130: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
6140: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
6150: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
6160: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
6170: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
6180: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
6190: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
61a0: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
61b0: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
61c0: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
61d0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
61e0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
61f0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
6200: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
6210: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
6220: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
6230: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
6240: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6250: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6270: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6280: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
6290: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
62a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
62b0: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
62c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
62d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
62e0: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
62f0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
6300: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
6310: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
6320: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
6330: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
6340: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
6350: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
6360: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
6370: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20 65  .    */.    u8 e
6380: 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20 69 66  celFlags;.    if
6390: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
63a0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
63b0: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
63c0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
63d0: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
63e0: 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   = SQLITE_ECEL_D
63f0: 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UP;.    }else{. 
6400: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
6410: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
6420: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
6430: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
6440: 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c  List, regResult,
6450: 20 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d   ecelFlags);.  }
6460: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6470: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6480: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6490: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
64a0: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
64b0: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
64c0: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
64d0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
64e0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
64f0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
6500: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
6510: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6520: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6530: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6540: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6550: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6560: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6570: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6580: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6590: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
65a0: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
65b0: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
65c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
65d0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
65e0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
65f0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
6600: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
6610: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6620: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
6630: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
6640: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
6650: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
6660: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
6670: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
6680: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
6690: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
66a0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
66b0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
66c0: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
66d0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
66e0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
66f0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
6700: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
6710: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
6720: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
6730: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
6740: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
6750: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
6760: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
6770: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
6780: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
6790: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
67a0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
67b0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
67c0: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
67d0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
67e0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
67f0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6800: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6810: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
6820: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
6830: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
6840: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
6850: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
6860: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
6870: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
6880: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
6890: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
68a0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
68b0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
68c0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
68d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
68e0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
68f0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
6900: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
6910: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
6920: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
6930: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
6940: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
6950: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
6960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6970: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
6980: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
6990: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
69a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
69b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
69c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
69d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
69e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
69f0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
6a00: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
6a10: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
6a20: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
6a30: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
6a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6a50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6a60: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
6a70: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
6a80: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
6a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6aa0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
6ab0: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
6ac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6ad0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6ae0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6af0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
6b00: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
6b10: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
6b20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b30: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
6b40: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
6b50: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
6b60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6b70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6b80: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
6b90: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
6ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6bb0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
6bc0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
6bd0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
6be0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
6bf0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
6c00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6c10: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6c20: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
6c30: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
6c40: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
6c50: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
6c60: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
6c70: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
6c80: 65 73 75 6c 74 43 6f 6c 2c 20 72 65 67 52 65 73  esultCol, regRes
6c90: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ult);.        br
6ca0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
6cb0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
6cd0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
6ce0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
6cf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
6d00: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
6d10: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
6d20: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
6d30: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
6d40: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
6d50: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
6d60: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
6d70: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
6d80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
6d90: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
6da0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
6db0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
6dc0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
6dd0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6df0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6e00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6e10: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
6e20: 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  ol, r1);.      s
6e30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6e40: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
6e50: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
6e60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
6e70: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6e80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
6e90: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6ea0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
6eb0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
6ec0: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
6ed0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
6ee0: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
6ef0: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
6f00: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
6f10: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
6f20: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
6f30: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
6f40: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6f50: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
6f60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6f70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
6f80: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
6f90: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
6fa0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
6fb0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
6fc0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
6fd0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
6fe0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  /..    /* Store 
6ff0: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
7000: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
7010: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
7020: 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a    case SRT_Fifo:
7030: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
7040: 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  stFifo:.    case
7050: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
7060: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
7070: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
7080: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
7090: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
70a0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
70b0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
70c0: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
70d0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
70e0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
70f0: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
7100: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7110: 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20  =SRT_Fifo );.   
7120: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7130: 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
7140: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
7150: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7160: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7170: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7180: 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  Col, r1+nPrefixR
7190: 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
71a0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
71b0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
71c0: 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20  T_DistFifo ){.  
71d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
71e0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44  destination is D
71f0: 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75  istFifo, then cu
7200: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
7210: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
7220: 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  * on an ephemera
7230: 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20  l index. If the 
7240: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61  current row is a
7250: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20  lready present. 
7260: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
7270: 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77   index, do not w
7280: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f  rite it to the o
7290: 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61  utput. If not, a
72a0: 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  dd the.        *
72b0: 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f  * current row to
72c0: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70   the index and p
72d0: 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74  roceed with writ
72e0: 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20  ing it to the.  
72f0: 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
7300: 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20  table as well.  
7310: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
7320: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
7330: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
7340: 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 4;.        sql
7350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7360: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
7370: 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31  Parm+1, addr, r1
7380: 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
7390: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
73a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
73b0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
73c0: 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a  , iParm+1, r1);.
73d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
73e0: 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pSort==0 );.    
73f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
7400: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
7410: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7420: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7430: 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69  rt, p, r1+nPrefi
7440: 78 52 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78  xReg, 1, nPrefix
7450: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7460: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
7470: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
7480: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
7490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
74a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
74b0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
74c0: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
74d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
74e0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
74f0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
7500: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7510: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7520: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7530: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7540: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
7550: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
7560: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
7570: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
7580: 72 73 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78  rse, r1, nPrefix
7590: 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72  Reg+1);.      br
75a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
75b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
75c0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
75d0: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
75e0: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
75f0: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
7600: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
7610: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
7620: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
7630: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
7640: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
7650: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
7660: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
7670: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
7680: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
7690: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
76a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
76b0: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
76c0: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
76d0: 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20  Sdst =.         
76e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
76f0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
7700: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
7710: 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
7720: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
7730: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
7740: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
7750: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
7760: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
7770: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
7780: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
7790: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
77a0: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
77b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
77c0: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
77d0: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
77e0: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
77f0: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
7800: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
7810: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
7820: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
7830: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
7840: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7850: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7860: 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72  egResult, 1, nPr
7870: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
7880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7890: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
78a0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
78b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
78c0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
78d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
78e0: 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26  egResult,1,r1, &
78f0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
7900: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
7910: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
7920: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
7930: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29  e, regResult, 1)
7940: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7950: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7960: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7970: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  rm, r1);.       
7980: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7990: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
79a0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
79b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
79c0: 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
79d0: 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
79e0: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
79f0: 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
7a00: 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
7a10: 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
7a20: 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
7a30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7a40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
7a50: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
7a60: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
7a70: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
7a80: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
7a90: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
7aa0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
7ab0: 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
7ac0: 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
7ad0: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
7ae0: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
7af0: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
7b00: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
7b10: 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
7b20: 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
7b30: 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
7b40: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
7b50: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7b60: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
7b70: 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d  ert( nResultCol=
7b80: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
7b90: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7ba0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7bb0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7bc0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20  , regResult, 1, 
7bd0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7bf0: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73    assert( regRes
7c00: 75 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20  ult==iParm );.  
7c10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
7c20: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
7c30: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
7c40: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
7c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7c60: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
7c70: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
7c80: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
7c90: 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54  */..    case SRT
7ca0: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20  _Coroutine:     
7cb0: 20 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74    /* Send data t
7cc0: 6f 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  o a co-routine *
7cd0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  /.    case SRT_O
7ce0: 75 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20  utput: {        
7cf0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  /* Return the re
7d00: 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74  sults */.      t
7d10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7d20: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7d30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7d40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
7d50: 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ut );.      if( 
7d60: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pSort ){.       
7d70: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7d80: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70  pParse, pSort, p
7d90: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7da0: 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78  sultCol, nPrefix
7db0: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
7dc0: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
7dd0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
7de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7df0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
7e00: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
7e10: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
7e20: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
7e30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7e40: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
7e50: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7e60: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
7e70: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
7e80: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
7e90: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
7ea0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7eb0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7ec0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
7ed0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
7ee0: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
7ef0: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  e results into a
7f00: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   priority queue 
7f10: 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63  that is order ac
7f20: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a  cording to.    *
7f30: 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  * pDest->pOrderB
7f40: 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65  y (in pSO).  pDe
7f50: 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20  st->iSDParm (in 
7f60: 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75  iParm) is the cu
7f70: 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20  rsor for an.    
7f80: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53  ** index with pS
7f90: 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d  O->nExpr+2 colum
7fa0: 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79  ns.  Build a key
7fb0: 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74   using pSO for t
7fc0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
7fd0: 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d  pSO->nExpr colum
7fe0: 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ns, then make su
7ff0: 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20  re all keys are 
8000: 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67  unique by adding
8010: 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20   a.    ** final 
8020: 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75  OP_Sequence colu
8030: 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f  mn.  The last co
8040: 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f  lumn is the reco
8050: 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20  rd as a blob..  
8060: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8070: 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20  T_DistQueue:.   
8080: 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a   case SRT_Queue:
8090: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65   {.      int nKe
80a0: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  y;.      int r1,
80b0: 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69   r2, r3;.      i
80c0: 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b  nt addrTest = 0;
80d0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
80e0: 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20  *pSO;.      pSO 
80f0: 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  = pDest->pOrderB
8100: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
8110: 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b   pSO );.      nK
8120: 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b  ey = pSO->nExpr;
8130: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
8140: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
8150: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20  arse);.      r2 
8160: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8170: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b  Range(pParse, nK
8180: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20  ey+2);.      r3 
8190: 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20  = r2+nKey+1;.   
81a0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
81b0: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
81c0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
81d0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
81e0: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
81f0: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
8200: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
8210: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
8220: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
8230: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
8240: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
8250: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
8260: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
8270: 75 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ueue. */.       
8280: 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69   addrTest = sqli
8290: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
82a0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
82b0: 61 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20  arm+1, 0, .     
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 20 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52     regResult, nR
82f0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8300: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
8310: 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
8320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8330: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
8340: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
8350: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29   nResultCol, r3)
8360: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  ;.      if( eDes
8370: 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
8380: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8390: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
83a0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
83b0: 50 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20  Parm+1, r3);.   
83c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
83d0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
83e0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
83f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79   for(i=0; i<nKey
8410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8430: 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20  2(v, OP_SCopy,. 
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75           regResu
8460: 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75  lt + pSO->a[i].u
8470: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
8480: 20 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   1,.            
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32                r2
84a0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
84b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
84d0: 6e 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e  nce, iParm, r2+n
84e0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Key);.      sqli
84f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8500: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8510: 72 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b  r2, nKey+2, r1);
8520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8530: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8540: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
8550: 20 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r1);.      if( 
8560: 61 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74  addrTest ) sqlit
8570: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
8580: 2c 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20  , addrTest);.   
8590: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
85a0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
85b0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
85c0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
85d0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20  nge(pParse, r2, 
85e0: 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62  nKey+2);.      b
85f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8600: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
8610: 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20  T_CTE */....#if 
8620: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8630: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
8640: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
8650: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
8660: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
8670: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
8680: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
8690: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
86a0: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
86b0: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
86c0: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
86d0: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
86e0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
86f0: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
8700: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
8710: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
8720: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
8730: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
8740: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
8750: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
8760: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
8770: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
8780: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8790: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
87a0: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
87b0: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
87c0: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
87d0: 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20  d.  Except, if. 
87e0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73   ** there is a s
87f0: 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20  orter, in which 
8800: 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20  case the sorter 
8810: 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69  has already limi
8820: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74  ted.  ** the out
8830: 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f  put for us..  */
8840: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
8850: 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  && p->iLimit ){.
8860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8870: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
8880: 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  JumpZero, p->iLi
8890: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
88a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
88b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
88c0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
88d0: 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74  bject sufficient
88e0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66   for an index of
88f0: 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61   N key columns a
8900: 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f  nd.** X extra co
8910: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  lumns..*/.KeyInf
8920: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
8930: 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a  oAlloc(sqlite3 *
8940: 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58  db, int N, int X
8950: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20  ){.  KeyInfo *p 
8960: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8970: 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20  cZero(0, .      
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
8990: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28  eof(KeyInfo) + (
89a0: 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  N+X)*(sizeof(Col
89b0: 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66  lSeq*)+1));.  if
89c0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  ( p ){.    p->aS
89d0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
89e0: 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a  &p->aColl[N+X];.
89f0: 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20      p->nField = 
8a00: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
8a10: 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b  XField = (u16)X;
8a20: 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e  .    p->enc = EN
8a30: 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  C(db);.    p->db
8a40: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52   = db;.    p->nR
8a50: 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ef = 1;.  }else{
8a60: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
8a70: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  ailed = 1;.  }. 
8a80: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
8a90: 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  .** Deallocate a
8aa0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
8ab0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b  */.void sqlite3K
8ac0: 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49  eyInfoUnref(KeyI
8ad0: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
8ae0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8af0: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
8b00: 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20   p->nRef--;.    
8b10: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
8b20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
8b30: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
8b40: 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f  ** Make a new po
8b50: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
8b60: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79  fo object.*/.Key
8b70: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
8b80: 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20  InfoRef(KeyInfo 
8b90: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
8ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
8bb0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
8bc0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nRef++;.  }.  re
8bd0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65  turn p;.}..#ifde
8be0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8bf0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8c00: 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   if a KeyInfo ob
8c10: 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e  ject can be chan
8c20: 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f  ge.  The KeyInfo
8c30: 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f   object.** can o
8c40: 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69  nly be changed i
8c50: 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61  f this is just a
8c60: 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63   single referenc
8c70: 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e  e to the object.
8c80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8c90: 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
8ca0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
8cb0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
8cc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65  */.int sqlite3Ke
8cd0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
8ce0: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65  (KeyInfo *p){ re
8cf0: 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b  turn p->nRef==1;
8d00: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
8d10: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
8d20: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
8d30: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
8d40: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
8d50: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
8d60: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
8d70: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8d80: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
8d90: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
8da0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
8db0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
8dc0: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
8dd0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
8de0: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
8df0: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
8e00: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
8e10: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
8e20: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
8e30: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
8e40: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
8e50: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
8e60: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
8e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
8e80: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
8e90: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
8ea0: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
8eb0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
8ec0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
8ed0: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
8ee0: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
8ef0: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
8f00: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
8f10: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
8f20: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ure is obtained 
8f30: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
8f40: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
8f50: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
8f60: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
8f70: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
8f80: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
8f90: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
8fa0: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
8fb0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
8fc0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
8fd0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
8fe0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8ff0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9000: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
9010: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
9020: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
9030: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
9040: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
9050: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
9060: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
9070: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
9080: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
9090: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
90a0: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
90b0: 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  he end */.){.  i
90c0: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
90d0: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
90e0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
90f0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
9100: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9110: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
9120: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
9130: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
9140: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
9150: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
9160: 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b  -iStart, nExtra+
9170: 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20  1);.  if( pInfo 
9180: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
9190: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
91a0: 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20  riteable(pInfo) 
91b0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74  );.    for(i=iSt
91c0: 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  art, pItem=pList
91d0: 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45  ->a+iStart; i<nE
91e0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
91f0: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
9200: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
9210: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
9220: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
9230: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
9240: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
9250: 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
9260: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
9270: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
9280: 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c  -iStart] = pColl
9290: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
92a0: 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61  SortOrder[i-iSta
92b0: 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  rt] = pItem->sor
92c0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
92d0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
92e0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
92f0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9300: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
9310: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
9320: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
9330: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
9340: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
9350: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
9360: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
9370: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
9380: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
9390: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
93a0: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
93b0: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
93c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
93d0: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
93e0: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
93f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
9400: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
9410: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
9420: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
9430: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
9440: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
9450: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
9460: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
9470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
9480: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
9490: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
94a0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
94b0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
94c0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
94d0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
94e0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
94f0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
9500: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
9510: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
9520: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
9530: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
9540: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
9550: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
9560: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
9570: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
9580: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
9590: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
95a0: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
95b0: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
95c0: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
95d0: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
95e0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
95f0: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
9600: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
9610: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
9620: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
9630: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
9640: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
9650: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
9660: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
9670: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9680: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
9690: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
96a0: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
96b0: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
96c0: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
96d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
96e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
96f0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
9700: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
9710: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
9720: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
9730: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
9740: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
9750: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
9760: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
9770: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
9780: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
9790: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
97a0: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
97b0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
97c0: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
97d0: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
97e0: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
97f0: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
9800: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
9810: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
9820: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
9830: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
9840: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
9850: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
9860: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
9870: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
9880: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
9890: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
98a0: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
98b0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
98c0: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
98d0: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
98e0: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
98f0: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
9900: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
9910: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
9920: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
9930: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9940: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
9950: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9960: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
9970: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
9980: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
9990: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
99a0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
99b0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
99c0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
99d0: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
99e0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
99f0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9a00: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9a10: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9a20: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
9a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
9a40: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
9a50: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
9a60: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9a70: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
9a80: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
9a90: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
9aa0: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
9ab0: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
9ac0: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
9ad0: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
9ae0: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
9af0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
9b00: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
9b10: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
9b20: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
9b30: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
9b40: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
9b50: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
9b60: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
9b70: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
9b80: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
9b90: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
9ba0: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
9bb0: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
9bc0: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
9bd0: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
9be0: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
9bf0: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
9c00: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
9c10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9c20: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
9c30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9c50: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
9c60: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
9c90: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9ca0: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
9cb0: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
9ce0: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
9cf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9d00: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
9d10: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
9d20: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d40: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
9d50: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
9d60: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
9d70: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
9d80: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
9d90: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
9da0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
9db0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
9dc0: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
9dd0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
9de0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
9df0: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
9e00: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
9e10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
9e20: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
9e30: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
9e40: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
9e50: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
9e60: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
9e70: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
9e80: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
9e90: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
9ea0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
9eb0: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
9ec0: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
9ed0: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
9ee0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
9ef0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
9f00: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
9f10: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
9f20: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
9f30: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
9f40: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
9f50: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
9f60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
9f70: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
9f80: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
9f90: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
9fa0: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
9fb0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
9fc0: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
9fd0: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
9fe0: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
9ff0: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
a000: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
a010: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
a020: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
a030: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
a040: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
a050: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
a060: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
a070: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a080: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
a090: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a0a0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a0b0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
a0c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
a0d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a0e0: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
a0f0: 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ort,   /* Inform
a100: 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44  ation on the ORD
a110: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
a120: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
a130: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a140: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61   columns of data
a150: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
a160: 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65   *pDest /* Write
a170: 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75   the sorted resu
a180: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
a190: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a1a0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a1c0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
a1d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
a1e0: 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
a1f0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a200: 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d  l(v);     /* Jum
a210: 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c  p here to exit l
a220: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
a230: 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  rContinue = sqli
a240: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a250: 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65  (v);  /* Jump he
a260: 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c  re for next cycl
a270: 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b  e */.  int addr;
a280: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
a290: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
a2a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
a2b0: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
a2c0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
a2d0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
a2e0: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
a2f0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
a300: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
a310: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
a320: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
a330: 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20  nt iSortTab;    
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a350: 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20  * Sorter cursor 
a360: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
a370: 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b    int nSortData;
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61    /* Trailing va
a3a0: 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f  lues to read fro
a3b0: 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e  m sorter */.  in
a3c0: 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b  t i;.  int bSeq;
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
a3f0: 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  f sorter record 
a400: 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f  includes seq. no
a410: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
a420: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
a430: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72  N_COMMENTS.  str
a440: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a450: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
a460: 45 4c 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66  EList->a;.#endif
a470: 0a 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ..  if( pSort->l
a480: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a490: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a4a0: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
a4b0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
a4c0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
a4d0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
a4e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a4f0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42  P_Goto, 0, addrB
a500: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
a510: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a520: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
a530: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  elBkOut);.  }.  
a540: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
a550: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
a560: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
a570: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
a580: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72  routine ){.    r
a590: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  egRowid = 0;.   
a5a0: 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d   regRow = pDest-
a5b0: 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72  >iSdst;.    nSor
a5c0: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
a5d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
a5e0: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
a5f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a600: 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d  e);.    regRow =
a610: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a620: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a630: 6e 53 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20  nSortData = 1;. 
a640: 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64   }.  nKey = pOrd
a650: 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53  erBy->nExpr - pS
a660: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69  ort->nOBSat;.  i
a670: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
a680: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
a690: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
a6a0: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
a6b0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
a6c0: 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20  .    iSortTab = 
a6d0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
a6e0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c      if( pSort->l
a6f0: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
a700: 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71     addrOnce = sq
a710: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
a720: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
a730: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
a740: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a750: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
a760: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
a770: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
a780: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
a790: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
a7a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
a7b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
a7c0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
a7d0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
a7e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
a7f0: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
a800: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
a810: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a820: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
a830: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
a840: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
a850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a860: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
a870: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
a880: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
a890: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
a8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
a8b0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
a8c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
a8d0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
a8e0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
a8f0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
a900: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
a910: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
a920: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
a930: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
a940: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
a950: 28 69 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74  (i=0; i<nSortDat
a960: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  a; i++){.    sql
a970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a980: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f  , OP_Column, iSo
a990: 72 74 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71  rtTab, nKey+bSeq
a9a0: 2b 69 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  +i, regRow+i);. 
a9b0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
a9c0: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
a9d0: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
a9e0: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
a9f0: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
aa00: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
aa10: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
aa20: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
aa30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aa40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
aa50: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
aa60: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
aa70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aa80: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
aa90: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
aaa0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
aab0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
aac0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
aad0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
aae0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
aaf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
ab00: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
ab10: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
ab20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ab30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ab40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
ab50: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ab60: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
ab70: 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  owid,.          
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
ab90: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31  Dest->affSdst, 1
aba0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
abb0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
abc0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
abd0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
abe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abf0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
ac00: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
ac10: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
ac20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ac30: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
ac40: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
ac50: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
ac60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
ac70: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
ac80: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
ac90: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
aca0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
acb0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
acc0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
acd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ace0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
acf0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
ad00: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
ad10: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
ad20: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
ad30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ad40: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
ad50: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
ad60: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
ad70: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
ad80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
ad90: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
ada0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
adb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
adc0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
add0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
ade0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
adf0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
ae00: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
ae10: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
ae20: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
ae30: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ae40: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ae50: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
ae60: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
ae70: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ae80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ae90: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
aea0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
aeb0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
aec0: 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gRow);.    sqlit
aed0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
aee0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
aef0: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65  d);.  }.  /* The
af00: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
af10: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
af20: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
af30: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
af40: 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  ue);.  if( pSort
af50: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
af60: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
af70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
af80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
af90: 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62  SorterNext, iTab
afa0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
afb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73  erage(v);.  }els
afc0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
afd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
afe0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
aff0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
b000: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f  );.  }.  if( pSo
b010: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20  rt->regReturn ) 
b020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b030: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
b040: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
b050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b060: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
b070: 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f  addrBreak);.}../
b080: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
b090: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
b0a0: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
b0b0: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
b0c0: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
b0d0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
b0e0: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
b0f0: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
b100: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
b110: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72  r..**.** Also tr
b120: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  y to estimate th
b130: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
b140: 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64  turned value and
b150: 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20   return that.** 
b160: 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57  result in *pEstW
b170: 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  idth..**.** The 
b180: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
b190: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
b1a0: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
b1b0: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
b1c0: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
b1d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b1e0: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
b1f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
b200: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
b210: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b220: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
b230: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
b240: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
b250: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
b260: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b270: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
b280: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
b290: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
b2a0: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
b2b0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
b2c0: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
b2d0: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
b2e0: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
b2f0: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
b300: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
b310: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
b320: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
b330: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
b340: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
b350: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
b360: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
b370: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
b380: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
b390: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
b3a0: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
b3b0: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
b3c0: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
b3d0: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
b3e0: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
b3f0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b400: 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68  routine has eith
b410: 65 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65  er 3 or 6 parame
b420: 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ters depending o
b430: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b440: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45  .** the SQLITE_E
b450: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b460: 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69  ADATA compile-ti
b470: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  me option is use
b480: 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  d..*/.#ifdef SQL
b490: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b4a0: 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66  N_METADATA.# def
b4b0: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
b4c0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
b4d0: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43  mnTypeImpl(A,B,C
b4e0: 2c 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63  ,D,E,F).static c
b4f0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
b500: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
b510: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
b520: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
b530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b540: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
b550: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
b560: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b570: 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38  *pzOrigCol,.  u8
b580: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20   *pEstWidth.){. 
b590: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
b5a0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
b5b0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
b5c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
b5d0: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
b5e0: 3b 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ;.#else /* if !d
b5f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
b600: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b610: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
b620: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
b630: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
b640: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a  TypeImpl(A,B,F).
b650: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
b660: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
b670: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
b680: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
b690: 70 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73  pExpr,.  u8 *pEs
b6a0: 74 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66  tWidth.){.#endif
b6b0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
b6c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b6d0: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20  N_METADATA) */. 
b6e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
b6f0: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
b700: 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d  .  u8 estWidth =
b710: 20 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   1;..  if( NEVER
b720: 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e  (pExpr==0) || pN
b730: 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  C->pSrcList==0 )
b740: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
b750: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
b760: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
b770: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
b780: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
b790: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
b7a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
b7b0: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
b7c0: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
b7d0: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
b7e0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
b7f0: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
b800: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
b810: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
b820: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
b830: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
b840: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
b850: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
b860: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
b870: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
b880: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
b890: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b8a0: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
b8b0: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
b8c0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
b8d0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
b8e0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
b8f0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
b900: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
b910: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
b920: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
b930: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b940: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
b950: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
b960: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b970: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
b980: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
b990: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
b9a0: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
b9b0: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
b9c0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
b9d0: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
b9e0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
b9f0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
ba00: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
ba10: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
ba20: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
ba30: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
ba40: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
ba50: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
ba60: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
ba70: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
ba80: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
ba90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
baa0: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
bab0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bac0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
bad0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
bae0: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
baf0: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
bb00: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
bb10: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
bb20: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
bb30: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
bb40: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
bb50: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
bb60: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
bb70: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
bb80: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
bb90: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
bba0: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
bbb0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
bbc0: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
bbd0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
bbe0: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
bbf0: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
bc00: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
bc10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
bc20: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
bc30: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
bc40: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
bc50: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
bc60: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
bc70: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
bc80: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
bc90: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
bca0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
bcb0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
bcc0: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
bcd0: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
bce0: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
bcf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
bd00: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
bd10: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
bd20: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
bd30: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
bd40: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
bd50: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
bd60: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
bd70: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
bd80: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
bd90: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
bda0: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
bdb0: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
bdc0: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bdd0: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
bde0: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
bdf0: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
be00: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
be10: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
be20: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
be30: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
be40: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
be50: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
be60: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
be70: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
be80: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
be90: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
bea0: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
beb0: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
bec0: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
bed0: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
bee0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
bef0: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
bf00: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
bf10: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
bf20: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bf30: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
bf40: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
bf50: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
bf60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
bf70: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
bf80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
bf90: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f  ( iCol>=0 && iCo
bfa0: 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<pS->pEList->nE
bfb0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
bfc0: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
bfd0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
bfe0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
bff0: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
c000: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
c010: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
c020: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
c030: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
c040: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
c050: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
c060: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
c070: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
c080: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
c090: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c0a0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
c0b0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
c0c0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
c0d0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
c0e0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
c0f0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
c100: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
c110: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
c120: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
c130: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
c140: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
c150: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
c160: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
c170: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
c180: 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69  zOrigCol, &estWi
c190: 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  dth); .        }
c1a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c1b0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
c1c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
c1d0: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
c1e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
c1f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
c200: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
c210: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
c220: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
c230: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
c240: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
c250: 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20  nCol) );.#ifdef 
c260: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c270: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c280: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
c2a0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
c2b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c2c0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
c2d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c2e0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c2f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
c300: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
c310: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61    zOrigCol = pTa
c320: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
c330: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ame;.          e
c340: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
c350: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
c360: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c370: 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70      zOrigTab = p
c380: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
c390: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
c3a0: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
c3b0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
c3c0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
c3d0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
c3e0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
c3f0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
c400: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
c410: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
c420: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
c430: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
c440: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
c450: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
c460: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
c470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c480: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
c490: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
c4a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
c4b0: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
c4c0: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
c4d0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
c4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c4f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
c500: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
c510: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
c520: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
c530: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
c540: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
c550: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
c560: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c570: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
c580: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
c590: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
c5a0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
c5b0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
c5c0: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
c5d0: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
c5e0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
c5f0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
c600: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
c610: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
c620: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
c630: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
c640: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
c650: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
c660: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
c670: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
c680: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
c690: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
c6a0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
c6b0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
c6c0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
c6d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
c6e0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
c6f0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
c700: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
c710: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
c720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c730: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
c740: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c750: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
c760: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
c770: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
c780: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
c790: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
c7a0: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
c7b0: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
c7c0: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
c7d0: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
c7e0: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
c7f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
c800: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
c810: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
c820: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
c830: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c840: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
c850: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
c860: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
c870: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
c880: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
c890: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
c8a0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
c8b0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
c8c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
c8d0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
c8e0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
c8f0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
c900: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
c910: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c920: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
c930: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
c940: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
c950: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
c960: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
c970: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c980: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
c990: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
c9a0: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
c9b0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
c9c0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
c9d0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
c9e0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
c9f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
ca00: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
ca10: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
ca20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
ca30: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
ca40: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
ca50: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
ca60: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
ca70: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
ca80: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
ca90: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
caa0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
cab0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
cac0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cad0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
cae0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
caf0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
cb00: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
cb10: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
cb20: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
cb30: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
cb40: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
cb50: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
cb60: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
cb70: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
cb80: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
cb90: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
cba0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
cbb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
cbc0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
cbd0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
cbe0: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
cbf0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
cc00: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
cc10: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
cc20: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
cc30: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
cc40: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
cc50: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
cc60: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
cc70: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
cc80: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
cc90: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
cca0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
ccb0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
ccc0: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
ccd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
cce0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
ccf0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
cd00: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
cd10: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
cd20: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
cd30: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
cd40: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTYPE) */.}../*.
cd50: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cd60: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
cd70: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
cd80: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
cd90: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
cda0: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
cdb0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
cdc0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
cdd0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
cde0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
cdf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
ce00: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ce10: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
ce20: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
ce30: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
ce40: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
ce50: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ce60: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
ce70: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
ce80: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
ce90: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
cea0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
ceb0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cec0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
ced0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
cee0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
cef0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
cf00: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
cf10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cf20: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
cf30: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
cf40: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
cf50: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
cf60: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
cf70: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cf80: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
cf90: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
cfa0: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
cfb0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
cfc0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
cfd0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
cfe0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
cff0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
d000: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
d010: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
d020: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
d030: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
d040: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
d050: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
d060: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
d070: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
d080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d090: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d0a0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
d0b0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
d0c0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
d0d0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
d0e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
d0f0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
d100: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
d110: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
d120: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
d130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d140: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d150: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d160: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
d170: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
d180: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
d190: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
d1a0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
d1b0: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
d1c0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
d1d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
d1e0: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
d1f0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
d200: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
d210: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
d220: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
d230: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
d240: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
d250: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
d260: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
d270: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
d280: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
d290: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
d2a0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
d2b0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
d2c0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
d2d0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
d2e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
d2f0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
d300: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
d310: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
d320: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d330: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
d340: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
d350: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d360: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
d370: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
d380: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
d390: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
d3a0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
d3b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d3c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d3d0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
d3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
d3f0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
d400: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
d410: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d420: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
d430: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
d440: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
d450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
d460: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
d470: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
d480: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
d490: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
d4a0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d4b0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d4c0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
d4d0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
d4e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d500: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
d510: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
d520: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
d530: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
d540: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
d560: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
d570: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
d580: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
d590: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
d5a0: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
d5b0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
d5c0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
d5d0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d5e0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d5f0: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
d600: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
d610: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
d620: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
d630: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
d640: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
d650: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
d660: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
d670: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
d680: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
d690: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
d6a0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
d6b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
d6c0: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
d6d0: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
d6e0: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
d6f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
d700: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d710: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
d720: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
d730: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
d740: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
d750: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
d760: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
d770: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
d780: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
d790: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
d7a0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
d7b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
d7c0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
d7d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
d7e0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
d7f0: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
d800: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
d810: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
d820: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
d830: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
d840: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
d850: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d860: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d870: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
d880: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d890: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
d8a0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
d8b0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
d8c0: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
d8d0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
d8e0: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
d8f0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d900: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
d910: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
d920: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
d930: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
d940: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
d950: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
d960: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d970: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
d980: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d990: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
d9a0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
d9b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
d9c0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
d9d0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
d9e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
d9f0: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
da00: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
da10: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
da20: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
da30: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
da40: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
da50: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
da60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
da70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
da80: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
da90: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
daa0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
dac0: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
dad0: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
dae0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
daf0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
db00: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
db10: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
db20: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
db30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
db40: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
db50: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
db60: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
db70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
db80: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
db90: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
dba0: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
dbb0: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
dbc0: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
dbd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
dbe0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
dbf0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
dc00: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
dc10: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
dc20: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
dc30: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
dc40: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
dc50: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
dc60: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
dc70: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
dc80: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
dc90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
dca0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
dcb0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
dcc0: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
dcd0: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
dce0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
dcf0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
dd00: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
dd10: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
dd20: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
dd30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
dd40: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
dd50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
dd60: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
dd70: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
dd80: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
dd90: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
dda0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
ddb0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
ddc0: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
ddd0: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
dde0: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
ddf0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
de00: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
de10: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
de20: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
de30: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
de40: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
de50: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
de60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
de70: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
de80: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
de90: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
dea0: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
deb0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
dec0: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
ded0: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
dee0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
def0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
df00: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
df10: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
df20: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
df30: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
df40: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
df50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
df60: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
df70: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
df80: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
df90: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
dfa0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
dfb0: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
dfc0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
dfd0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
dfe0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
dff0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
e000: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
e010: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
e020: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
e030: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
e040: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
e050: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
e060: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
e070: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
e080: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
e090: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
e0a0: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
e0b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
e0c0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e0d0: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
e0e0: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
e0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
e100: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e110: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e120: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
e130: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e140: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
e150: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
e160: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
e170: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
e180: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
e190: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20     ** append an 
e1a0: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
e1b0: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
e1c0: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
e1d0: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
e1e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
e1f0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
e200: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
e210: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
e220: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
e230: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
e240: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
e250: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
e260: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e;.        int k
e270: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
e280: 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20  nName-1; k>1 && 
e290: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
e2a0: 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  Name[k]); k--){}
e2b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d  .        if( k>=
e2c0: 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27  0 && zName[k]=='
e2d0: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a  :' ) nName = k;.
e2e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
e2f0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
e300: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
e310: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e320: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
e330: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
e340: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e350: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
e360: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
e370: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
e380: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
e390: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
e3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e3b0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
e3c0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
e3d0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e3e0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
e3f0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
e400: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e410: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
e420: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
e430: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e440: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
e450: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
e460: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e480: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
e490: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e4a0: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
e4b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
e4c0: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
e4d0: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
e4e0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
e4f0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
e500: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
e510: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
e520: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
e530: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
e540: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
e550: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
e560: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
e570: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
e580: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
e590: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
e5a0: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
e5b0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
e5c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
e5d0: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
e5e0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
e5f0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
e600: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
e610: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
e620: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
e630: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
e640: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
e650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e660: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e670: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
e680: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
e690: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
e6a0: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
e6b0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
e6c0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
e6d0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
e6e0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
e6f0: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
e700: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
e710: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e720: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
e730: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
e740: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
e750: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
e760: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
e770: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
e780: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
e790: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
e7a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
e7b0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
e7c0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
e7d0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
e7e0: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
e7f0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
e800: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
e810: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
e820: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
e830: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e840: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
e850: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
e860: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
e870: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
e880: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
e890: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
e8a0: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
e8b0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
e8c0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
e8d0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
e8e0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
e8f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
e900: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
e910: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  {.      pCol->zT
e920: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ype = sqlite3DbS
e930: 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e  trDup(db, column
e940: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30  Type(&sNC, p,0,0
e950: 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  ,0, &pCol->szEst
e960: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ));.    }.    sz
e970: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e980: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e990: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e9a0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e9b0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
e9c0: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
e9d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
e9e0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
e9f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ea00: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ea10: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ea20: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
ea30: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
ea40: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
ea50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
ea60: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
ea70: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
ea80: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
ea90: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
eaa0: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
eab0: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
eac0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
ead0: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
eae0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
eaf0: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
eb00: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
eb10: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
eb20: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
eb30: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
eb40: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
eb50: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
eb60: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
eb70: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
eb80: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
eb90: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
eba0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
ebb0: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
ebc0: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
ebd0: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
ebe0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
ebf0: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
ec00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
ec10: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
ec20: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
ec30: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ec40: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
ec50: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
ec60: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
ec70: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
ec80: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
ec90: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
eca0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
ecb0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
ecc0: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
ecd0: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
ece0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
ecf0: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
ed00: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
ed10: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
ed20: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
ed30: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
ed40: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
ed50: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
ed60: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
ed70: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
ed80: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
ed90: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
eda0: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
edb0: 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
edc0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
edd0: 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74  576) );.  select
ede0: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
edf0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
ee00: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
ee10: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
ee20: 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74  >aCol);.  select
ee30: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
ee40: 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
ee50: 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29  , pTab, pSelect)
ee60: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
ee70: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
ee80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ee90: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
eea0: 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  eTable(db, pTab)
eeb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
eec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
eed0: 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  b;.}../*.** Get 
eee0: 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67  a VDBE for the g
eef0: 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74  iven parser cont
ef00: 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ext.  Create a n
ef10: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
ef20: 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ary..** If an er
ef30: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
ef40: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76  rn NULL and leav
ef50: 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70  e a message in p
ef60: 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a  Parse..*/.Vdbe *
ef70: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50  sqlite3GetVdbe(P
ef80: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
ef90: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
efa0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20  e->pVdbe;.  if( 
efb0: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20  v==0 ){.    v = 
efc0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20  pParse->pVdbe = 
efd0: 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74  sqlite3VdbeCreat
efe0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
eff0: 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64  f( v ) sqlite3Vd
f000: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49  beAddOp0(v, OP_I
f010: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  nit);.    if( pP
f020: 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d  arse->pToplevel=
f030: 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  =0.     && Optim
f040: 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
f050: 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45  Parse->db,SQLITE
f060: 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29  _FactorOutConst)
f070: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50  .    ){.      pP
f080: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
f090: 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  tor = 1;.    }..
f0a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
f0b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
f0c0: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
f0d0: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
f0e0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
f0f0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
f100: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f110: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
f120: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f130: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
f140: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
f150: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
f160: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
f170: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
f180: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
f190: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
f1a0: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
f1b0: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
f1c0: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
f1d0: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
f1e0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
f1f0: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
f200: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
f210: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
f220: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
f230: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
f240: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
f250: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
f260: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
f270: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
f280: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
f290: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
f2a0: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
f2b0: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
f2c0: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
f2d0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
f2e0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
f2f0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f300: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
f310: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
f320: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
f330: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
f340: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
f350: 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
f360: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
f370: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
f380: 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
f390: 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
f3a0: 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
f3b0: 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
f3c0: 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
f3d0: 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
f3e0: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
f3f0: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
f400: 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
f410: 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
f420: 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
f430: 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
f440: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
f450: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
f460: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
f470: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
f480: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
f490: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
f4a0: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
f4b0: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
f4c0: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
f4d0: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
f4e0: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
f4f0: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
f500: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f510: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
f520: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
f530: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
f540: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
f550: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
f560: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
f570: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
f580: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
f590: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a    int addr1, n;.
f5a0: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
f5b0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
f5c0: 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
f5d0: 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
f5e0: 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
f5f0: 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
f600: 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
f610: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
f620: 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
f630: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
f640: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
f650: 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
f660: 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
f670: 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
f680: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
f690: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
f6a0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
f6b0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
f6c0: 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  ->pLimit!=0 );. 
f6d0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
f6e0: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
f6f0: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
f700: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
f710: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f720: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
f730: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
f740: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
f750: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
f760: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
f770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f780: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
f790: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
f7a0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f7b0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f7c0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f7d0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
f7e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f7f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
f800: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
f810: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
f820: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
f830: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
f840: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
f850: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
f860: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f870: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
f880: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
f890: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
f8a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f8b0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
f8c0: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
f8d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f8e0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
f8f0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
f900: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
f910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f920: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
f930: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
f940: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f950: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f960: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
f970: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
f980: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
f990: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
f9a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
f9b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
f9c0: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
f9d0: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
f9e0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
f9f0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
fa00: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
fa10: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
fa20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fa30: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
fa40: 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
fa50: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa60: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
fa70: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
fa80: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
fa90: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
faa0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
fab0: 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  s, iOffset); Vdb
fac0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
faf0: 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29  ger, 0, iOffset)
fb00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fb10: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
fb20: 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ddr1);.      sql
fb30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fb40: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
fb50: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
fb60: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
fb70: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
fb80: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
fb90: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
fba0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fbb0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
fbc0: 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
fbd0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
fbe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fbf0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
fc00: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
fc10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fc20: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
fc30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
fc40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fc50: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
fc60: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
fc70: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
fc80: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fc90: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
fca0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
fcb0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
fcc0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
fcd0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fce0: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
fcf0: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
fd00: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
fd10: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
fd20: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
fd30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fd40: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
fd50: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
fd60: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
fd70: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
fd80: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
fd90: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
fda0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
fdb0: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
fdc0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
fdd0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
fde0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
fdf0: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
fe00: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
fe10: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
fe20: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
fe30: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
fe40: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
fe50: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
fe60: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
fe70: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
fe80: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   );.  if( pRet==
fe90: 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c  0 && iCol<p->pEL
fea0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
feb0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
fec0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
fed0: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
fee0: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
fef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ff00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
ff10: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
ff20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
ff30: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
ff40: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
ff50: 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
ff60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
ff70: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
ff80: 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
ff90: 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
ffa0: 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
ffb0: 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
ffc0: 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
ffd0: 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
ffe0: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
fff0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
10000 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
10010 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
10020 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
10030 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
10040 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
10050 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
10060 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
10070 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
10080 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
10090 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
100a0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
100b0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
100c0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
100d0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
100e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
100f0 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
10100 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
10110 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
10120 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10130 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
10140 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10150 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
10160 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
10170 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
10180 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
10190 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
101a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
101b0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
101c0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
101d0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
101e0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
101f0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
10200 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
10210 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
10220 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
10230 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
10240 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
10250 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10260 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
10270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10280 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
10290 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
102a0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
102b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
102c0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
102d0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
102e0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
102f0 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
10300 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
10310 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10320 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
10330 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
10340 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
10350 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
10360 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10370 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10380 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
10390 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
103a0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
103b0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
103c0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
103d0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
103e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
103f0 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
10400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10410 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
10420 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
10430 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
10440 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
10450 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
10460 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
10470 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
10480 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
10490 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
104a0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
104b0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
104c0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
104f0 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
10500 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
10510 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
10530 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
10550 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
10560 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
10570 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
10580 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
10590 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
105a0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
105b0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
105c0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
105d0 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65  >a[].isRecursive
105e0 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
105f0 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
10600 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
10610 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
10620 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
10630 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
10640 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
10650 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
10660 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
10670 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
10680 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
10690 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
106a0 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
106b0 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
106c0 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
106d0 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
106e0 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
106f0 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
10700 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
10710 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
10720 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
10730 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
10740 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
10750 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
10760 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
10770 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
10780 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
10790 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
107a0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
107b0 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
107c0 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
107d0 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
107e0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
107f0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
10800 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
10810 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
10820 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
10830 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
10840 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
10850 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
10860 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
10870 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
10880 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
10890 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
108a0 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
108b0 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
108c0 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
108d0 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
108e0 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
108f0 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
10900 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
10910 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
10920 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
10930 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
10940 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
10950 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
10960 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
10970 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
10980 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
10990 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
109a0 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
109b0 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
109c0 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
109d0 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
109e0 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
109f0 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
10a00 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
10a10 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
10a20 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
10a30 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
10a40 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
10a50 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
10a60 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
10a70 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
10a80 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
10a90 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
10aa0 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
10ab0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
10ac0 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
10ad0 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
10ae0 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
10af0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
10b00 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
10b10 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
10b20 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
10b30 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
10b40 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
10b50 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
10b60 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
10b70 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
10b80 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
10b90 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
10ba0 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
10bb0 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
10bc0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10bd0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10be0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
10bf0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10c00 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
10c10 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
10c20 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
10c30 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
10c40 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
10c50 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
10c60 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
10c70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
10c80 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
10c90 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
10ca0 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
10cb0 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
10cc0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
10cd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
10ce0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
10cf0 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
10d00 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
10d10 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
10d20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
10d30 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
10d40 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
10d50 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
10d60 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
10d70 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
10d80 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
10d90 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
10da0 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
10db0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
10dc0 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
10dd0 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
10de0 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
10df0 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
10e00 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
10e10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
10e20 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
10e30 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
10e40 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
10e50 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10e60 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
10e70 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
10e80 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
10e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10ea0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
10eb0 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
10ec0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
10ed0 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
10ee0 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
10ef0 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
10f00 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f  eDest = SRT_Fifo
10f10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  ;         /* How
10f20 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
10f30 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
10f40 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
10f50 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
10f60 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
10f70 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
10f80 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
10fb0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
10fe0 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
10ff0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
11000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
11010 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11020 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
11030 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *pOffset;      
11040 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
11050 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
11060 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
11070 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
11080 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
11090 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
110a0 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
110b0 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
110c0 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
110d0 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
110e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
110f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11100 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
11110 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
11120 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
11130 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
11140 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
11150 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
11160 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
11170 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11180 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
11190 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
111a0 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
111b0 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
111c0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66  ->pLimit;.  pOff
111d0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
111e0 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70  ;.  regLimit = p
111f0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f  ->iLimit;.  regO
11200 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
11210 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  et;.  p->pLimit 
11220 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  = p->pOffset = 0
11230 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
11240 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
11250 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
11260 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
11270 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f  Locate the curso
11280 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
11290 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
112a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41  .  for(i=0; ALWA
112b0 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
112c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
112d0 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63  pSrc->a[i].isRec
112e0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
112f0 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
11300 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
11310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11320 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
11330 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
11340 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
11350 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
11360 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
11370 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
11380 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
11390 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
113a0 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
113b0 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
113c0 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
113d0 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69  tFifo and SRT_Di
113e0 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74  stQueue destinat
113f0 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f  ions to work. */
11400 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72  .  iQueue = pPar
11410 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66  se->nTab++;.  if
11420 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
11430 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  N ){.    eDest =
11440 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
11450 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f  DistQueue : SRT_
11460 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44  DistFifo;.    iD
11470 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
11480 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
11490 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  e{.    eDest = p
114a0 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75  OrderBy ? SRT_Qu
114b0 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a  eue : SRT_Fifo;.
114c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
114d0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
114e0 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69  tQueue, eDest, i
114f0 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  Queue);..  /* Al
11500 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
11510 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75  or Current, Queu
11520 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  e, and Distinct.
11530 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74   */.  regCurrent
11540 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
11550 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  m;.  sqlite3Vdbe
11560 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
11570 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e  nPseudo, iCurren
11580 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e  t, regCurrent, n
11590 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64  Col);.  if( pOrd
115a0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
115b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
115c0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
115d0 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
115e0 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , p, 1);.    sql
115f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11600 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
11610 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  al, iQueue, pOrd
11620 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30  erBy->nExpr+2, 0
11630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11640 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11650 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
11660 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75  NFO);.    destQu
11670 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  eue.pOrderBy = p
11680 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65  OrderBy;.  }else
11690 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
116a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
116b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
116c0 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a  eue, nCol);.  }.
116d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
116e0 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29  , "Queue table")
116f0 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e  );.  if( iDistin
11700 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64  ct ){.    p->add
11710 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73  rOpenEphm[0] = s
11720 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11730 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11740 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c  eral, iDistinct,
11750 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46   0);.    p->selF
11760 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
11770 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20  phemeral;.  }.. 
11780 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f   /* Detach the O
11790 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
117a0 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  rom the compound
117b0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e   SELECT */.  p->
117c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
117d0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
117e0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74  sults of the set
117f0 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75  up-query in Queu
11800 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e  e. */.  pSetup->
11810 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20  pNext = 0;.  rc 
11820 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11830 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20  pParse, pSetup, 
11840 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70  &destQueue);.  p
11850 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70  Setup->pNext = p
11860 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
11870 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
11880 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
11890 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
118a0 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
118b0 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
118c0 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
118d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
118e0 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
118f0 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
11900 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
11910 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61  ge(v);..  /* Tra
11920 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72  nsfer the next r
11930 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72  ow in Queue over
11940 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   to Current */. 
11950 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11960 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
11970 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20  , iCurrent); /* 
11980 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20  To reset column 
11990 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70  cache */.  if( p
119a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
119b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
119c0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
119d0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
119e0 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72  >nExpr+1, regCur
119f0 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rent);.  }else{.
11a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11a10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
11a20 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67  ata, iQueue, reg
11a30 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  Current);.  }.  
11a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11a50 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
11a60 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f  iQueue);..  /* O
11a70 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65  utput the single
11a80 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
11a90 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20  */.  addrCont = 
11aa0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11ab0 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f  abel(v);.  codeO
11ac0 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73  ffset(v, regOffs
11ad0 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  et, addrCont);. 
11ae0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
11af0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
11b00 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c  EList, iCurrent,
11b10 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
11b20 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
11b30 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
11b40 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
11b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11b60 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
11b70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
11b80 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
11b90 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11ba0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
11bb0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
11bc0 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
11bd0 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
11be0 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
11bf0 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
11c00 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11c10 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
11c20 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
11c30 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
11c40 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
11c50 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
11c60 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
11c70 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
11c80 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
11c90 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65  stQueue);.  asse
11ca0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
11cb0 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   );.  p->pPrior 
11cc0 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20  = pSetup;..  /* 
11cd0 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
11ce0 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
11cf0 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
11d00 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
11d10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
11d20 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
11d30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11d40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
11d50 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f  Break);..end_of_
11d60 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a  recursive_query:
11d70 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
11d80 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
11d90 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  >db, p->pOrderBy
11da0 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  );.  p->pOrderBy
11db0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
11dc0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
11dd0 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  t;.  p->pOffset 
11de0 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74  = pOffset;.  ret
11df0 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
11e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11e10 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20   */../* Forward 
11e20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74  references */.st
11e30 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
11e40 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
11e50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11e60 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11e70 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11e80 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11e90 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
11ea0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
11eb0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
11ec0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
11ed0 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
11ee0 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
11ef0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f  results */.);../
11f00 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61  *.** Error messa
11f10 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20  ge for when two 
11f20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66  or more terms of
11f30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
11f40 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ct have differen
11f50 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74  t.** size result
11f60 20 73 65 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   sets..*/.static
11f70 20 76 6f 69 64 20 73 65 6c 65 63 74 57 72 6f 6e   void selectWron
11f80 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50  gNumTermsError(P
11f90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11fa0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
11fb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
11fc0 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73  _Values ){.    s
11fd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11fe0 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
11ff0 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
12000 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
12010 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65  terms");.  }else
12020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12030 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
12040 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
12050 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
12060 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e  %s".      " do n
12070 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ot have the same
12080 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
12090 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65  t columns", sele
120a0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
120b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  ;.  }.}../*.** H
120c0 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
120d0 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
120e0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
120f0 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12100 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
12110 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
12120 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
12130 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
12140 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
12150 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
12160 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
12170 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
12180 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
12190 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
121a0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
121b0 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
121c0 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
121d0 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
121e0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
121f0 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
12200 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
12210 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
12220 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
12230 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
12240 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12250 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
12260 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
12270 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
12280 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12290 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
122a0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
122b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
122c0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
122d0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
122e0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
122f0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12300 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12310 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12320 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
12330 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
12340 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
12350 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  ist->nExpr;.  in
12360 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
12370 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
12380 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
12390 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
123a0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
123b0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
123c0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
123d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
123e0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
123f0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
12400 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
12410 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12420 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
12430 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
12440 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
12450 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
12460 45 78 70 72 21 3d 6e 45 78 70 72 20 29 7b 0a 20  Expr!=nExpr ){. 
12470 20 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e 67       selectWrong
12480 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
12490 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
124a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
124b0 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f      if( p->pPrio
124c0 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r==0 ) break;.  
124d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
124e0 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b  ior->pNext==p );
124f0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
12500 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a  or;.    nRow++;.
12510 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77    }while(1);.  w
12520 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
12530 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
12540 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  r;.    p->pPrior
12550 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
12560 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12570 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
12580 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
12590 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20  pPrior;.    if( 
125a0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
125b0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
125c0 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
125d0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
125e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
125f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12600 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
12610 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
12620 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
12630 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
12640 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
12650 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
12660 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
12670 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
12680 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
12690 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
126a0 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
126b0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
126c0 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
126d0 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
126e0 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
126f0 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
12700 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
12710 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
12720 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
12730 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
12740 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
12750 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
12760 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
12770 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
12780 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
12790 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
127a0 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
127b0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
127c0 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
127d0 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
127e0 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
127f0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
12800 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
12810 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
12820 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
12830 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
12840 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
12850 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
12860 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
12870 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
12880 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
12890 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
128a0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
128b0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
128c0 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
128d0 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
128e0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
128f0 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
12900 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
12910 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
12920 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
12930 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
12940 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
12950 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12960 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
12970 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
12980 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
12990 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
129a0 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
129b0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
129c0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
129d0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
129e0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
129f0 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
12a00 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
12a10 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
12a20 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
12a30 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
12a40 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
12a50 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
12a60 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
12a70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12a80 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12a90 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12ab0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12ac0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12ad0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12ae0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12af0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12b00 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12b10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
12b20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
12b30 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
12b40 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
12b50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
12b60 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
12b70 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
12b80 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
12b90 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
12ba0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12bb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12bc0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
12bd0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
12be0 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
12bf0 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
12c00 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
12c10 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
12c20 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
12c30 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
12c40 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
12c50 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
12c60 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
12c70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23   connection */.#
12c80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12c90 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
12ca0 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20   iSub1 = 0;     
12cb0 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
12cc0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
12cd0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d  */.  int iSub2 =
12ce0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51   0;        /* EQ
12cf0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
12d00 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
12d10 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
12d20 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  re there is no O
12d30 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
12d40 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72   clause on prior
12d50 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a   SELECTs.  Only.
12d60 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72    ** the last (r
12d70 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43  ight-most) SELEC
12d80 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20  T in the series 
12d90 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45  may have an ORDE
12da0 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20  R BY or LIMIT.. 
12db0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20   */.  assert( p 
12dc0 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20  && p->pPrior ); 
12dd0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63   /* Calling func
12de0 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20  tion guarantees 
12df0 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61  this much */.  a
12e00 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
12e10 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
12e20 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d  ve)==0 || p->op=
12e30 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70  =TK_ALL || p->op
12e40 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
12e50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
12e60 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
12e70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20  Prior;.  dest = 
12e80 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
12e90 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
12ea0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12eb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
12ec0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
12ed0 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
12ee0 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
12ef0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
12f00 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
12f10 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
12f20 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12f30 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
12f40 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
12f50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12f60 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
12f70 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
12f80 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
12f90 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
12fa0 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
12fb0 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
12fc0 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
12fd0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
12fe0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
12ff0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
13000 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
13010 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
13020 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
13030 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
13040 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
13050 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
13060 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
13070 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
13080 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
13090 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
130a0 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
130b0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
130c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
130d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
130e0 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
130f0 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
13100 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
13110 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13120 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
13130 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73  RDERED);.    des
13140 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
13150 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
13160 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
13170 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
13180 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
13190 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
131a0 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
131b0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
131c0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
131d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
131e0 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
131f0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
13200 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13210 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13220 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
13230 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
13240 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
13250 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
13260 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
13270 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
13280 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
13290 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
132a0 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
132b0 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d  List );.  if( p-
132c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
132d0 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e  pPrior->pEList->
132e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 65 6c  nExpr ){.    sel
132f0 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73  ectWrongNumTerms
13300 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 29  Error(pParse, p)
13310 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
13320 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13330 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69  ect_end;.  }..#i
13340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13350 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
13360 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
13370 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
13380 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
13390 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
133a0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
133b0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
133c0 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
133d0 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
133e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
133f0 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
13400 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
13410 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
13420 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
13430 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
13440 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
13450 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
13460 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
13470 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
13480 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
13490 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
134a0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
134b0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
134c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
134d0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
134e0 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
134f0 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
13500 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
13510 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
13520 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
13530 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
13540 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
13550 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
13560 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
13570 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
13580 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
13590 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
135a0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
135b0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
135c0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
135d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
135e0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
135f0 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
13600 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
13610 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
13620 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
13630 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
13640 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
13650 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
13660 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
13670 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
13680 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
13690 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
136a0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
136b0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
136c0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
136d0 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
136e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
136f0 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
13700 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
13710 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13720 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13730 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
13740 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
13750 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
13760 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13770 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
13780 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13790 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
137a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
137b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
137c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
137d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137e0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
137f0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
13800 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
13810 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
13820 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
13830 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
13840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
13850 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
13860 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
13870 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
13880 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
13890 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
138a0 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
138b0 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c  ectRow > (u64)nL
138c0 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
138d0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
138e0 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  tRow = nLimit;. 
138f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13900 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
13910 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13920 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
13930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
13940 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
13950 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
13960 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
13970 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
13980 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
13990 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
139a0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
139b0 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
139c0 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
139d0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
139e0 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
139f0 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
13a00 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
13a10 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
13a20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
13a30 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
13a40 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
13a50 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
13a60 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
13a70 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
13a80 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
13a90 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
13aa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
13ab0 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
13ac0 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
13ad0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
13ae0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13af0 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
13b00 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
13b10 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
13b20 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
13b30 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
13b40 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
13b50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
13b60 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
13b70 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
13b80 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
13b90 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
13ba0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
13bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13bc0 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
13bd0 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
13be0 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
13bf0 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
13c00 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
13c10 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
13c20 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
13c30 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
13c40 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
13c50 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13c60 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
13c70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c80 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
13c90 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
13ca0 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
13cb0 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
13cc0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
13cd0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
13ce0 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
13cf0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
13d00 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
13d10 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
13d20 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
13d30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
13d40 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
13d50 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
13d60 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
13d70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
13d80 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
13d90 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
13da0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13db0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
13dc0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
13dd0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
13de0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
13df0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
13e00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13e10 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13e20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
13e30 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
13e40 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
13e50 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
13e60 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
13e70 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
13e80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
13e90 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
13ea0 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
13eb0 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
13ec0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13ed0 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13ee0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13ef0 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
13f00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13f10 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
13f20 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
13f30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13f40 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
13f50 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
13f60 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
13f70 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
13f80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
13f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13fa0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
13fb0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
13fc0 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
13fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13fe0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
13ff0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
14000 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
14010 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
14020 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14030 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
14040 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
14050 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
14060 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
14070 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14080 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
14090 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
140a0 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
140b0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
140c0 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
140d0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
140e0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
140f0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
14100 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
14110 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
14120 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14130 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
14140 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
14150 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
14160 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
14170 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
14180 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
14190 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
141a0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
141b0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
141c0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
141d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
141e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
141f0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
14200 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
14210 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
14220 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
14230 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
14240 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
14250 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14260 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
14270 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
14280 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
14290 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
142a0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
142b0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
142c0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
142d0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
142e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
142f0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
14300 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
14310 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
14320 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
14330 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
14340 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
14350 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
14360 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
14370 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
14380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14390 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
143a0 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
143b0 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
143c0 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
143d0 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
143e0 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
143f0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
14400 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
14410 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14420 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
14430 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
14440 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
14450 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
14460 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
14470 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
14480 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
14490 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
144a0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
144b0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
144c0 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
144d0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
14500 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
14510 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
14520 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
14530 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
14540 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
14550 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14560 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
14570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
14590 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
145a0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
145b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
145c0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
145d0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
145e0 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
145f0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
14600 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
14610 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20  ist, unionTab,. 
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
14640 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
14650 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
14660 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14670 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
14680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14690 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
146a0 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
146b0 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65  Start); VdbeCove
146c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
146d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
146e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
146f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
14700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14710 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
14720 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
14730 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
14740 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
14750 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
14760 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
14770 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
14780 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
14790 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
147a0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
147b0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
147c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
147d0 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
147e0 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
147f0 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
14800 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
14810 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
14820 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
14830 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
14840 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
14850 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
14860 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
14870 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
14880 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
14890 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
148a0 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
148b0 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
148c0 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
148d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
148e0 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
148f0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14900 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14910 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
14920 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
14930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14940 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
14950 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
14960 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
14970 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
14980 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
14990 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
149a0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69  = addr;.      fi
149b0 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
149c0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
149d0 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
149e0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
149f0 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20  EList );..      
14a00 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
14a10 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  CTs to our left 
14a20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
14a30 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20  able "tab1"..   
14a40 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
14a50 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14a60 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  t(&intersectdest
14a70 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62  , SRT_Union, tab
14a80 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  1);.      explai
14a90 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
14aa0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
14ab0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
14ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
14ad0 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14ae0 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65  or, &intersectde
14af0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
14b00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
14b10 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14b20 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
14b30 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
14b40 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e  urrent SELECT in
14b50 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
14b60 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20  le "tab2".      
14b70 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
14b80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14b90 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14ba0 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b  meral, tab2, 0);
14bb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14bc0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
14bd0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
14be0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
14bf0 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [1] = addr;.    
14c00 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
14c10 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
14c20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
14c30 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
14c40 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
14c50 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
14c60 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
14c70 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63  ;.      intersec
14c80 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20  tdest.iSDParm = 
14c90 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c  tab2;.      expl
14ca0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
14cb0 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
14cc0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14cd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14ce0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
14cf0 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
14d00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
14d10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14d20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
14d30 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
14d40 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14d50 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
14d60 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
14d70 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14d80 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
14d90 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
14da0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
14db0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
14dc0 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
14dd0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
14de0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
14df0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
14e00 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffset;..      /*
14e10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14e20 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
14e30 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
14e40 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
14e50 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
14e60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14e70 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
14e80 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
14e90 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
14ea0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ut ){.        Se
14eb0 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
14ec0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
14ed0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
14ee0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
14ef0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
14f00 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
14f10 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
14f20 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
14f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14f40 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
14f50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14f60 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
14f70 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
14f80 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
14f90 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
14fa0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
14fb0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14fd0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14fe0 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
14ff0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15000 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
15010 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15020 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61  rse);.      iSta
15030 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
15040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15050 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  Key, tab1, r1);.
15060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15070 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
15080 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
15090 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20   iCont, r1, 0); 
150a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
150b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
150c0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
150d0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
150e0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
150f0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
15100 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20  List, tab1,.    
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
15130 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
15140 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15150 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15160 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  iCont);.      sq
15170 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15180 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31  v, OP_Next, tab1
15190 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
151a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
151b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
151c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
151d0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
151e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
151f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
15200 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
15210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15220 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
15230 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
15240 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
15250 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
15260 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
15270 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
15280 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
15290 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
152a0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
152b0 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
152c0 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
152d0 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
152e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
152f0 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
15300 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
15310 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
15320 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
15330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
15340 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
15350 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
15360 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15370 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
15380 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
15390 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
153a0 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
153b0 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
153c0 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
153d0 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
153e0 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
153f0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15400 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
15410 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
15420 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
15430 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
15440 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
15450 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
15460 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
15470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15480 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15490 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
154a0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
154b0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
154c0 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
154d0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
154e0 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15500 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
15510 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
15520 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
15530 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
15540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
15550 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
15560 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
15570 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
15580 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
15590 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
155a0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
155b0 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
155c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
155d0 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
155e0 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
155f0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
15600 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
15610 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
15620 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
15630 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
15640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15650 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
15660 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
15670 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
15680 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
15690 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
156a0 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
156b0 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
156c0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
156d0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
156e0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
156f0 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
15700 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
15710 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15730 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
15740 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
15750 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
15760 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15770 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
15780 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
15790 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
157a0 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
157b0 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
157c0 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
157d0 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
157e0 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
157f0 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
15800 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
15810 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
15820 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
15830 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
15840 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
15850 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
15860 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15870 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
15880 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15890 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
158a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
158b0 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
158c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158d0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
158e0 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
158f0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
15900 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
15930 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
15940 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
15950 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
15960 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
15970 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
15980 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
15990 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
159a0 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
159b0 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
159c0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
159d0 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
159e0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
159f0 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
15a00 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
15a10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15a20 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15a30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
15a40 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
15a50 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
15a60 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
15a70 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
15a80 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
15a90 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
15aa0 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
15ab0 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
15ac0 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
15ad0 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
15ae0 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
15af0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
15b00 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
15b10 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
15b20 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
15b30 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
15b40 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
15b50 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
15b60 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
15b70 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
15b80 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
15b90 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
15ba0 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
15bb0 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
15bc0 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
15bd0 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
15be0 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
15bf0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
15c00 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
15c10 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
15c20 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
15c30 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
15c40 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
15c50 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
15c60 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
15c70 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
15c80 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
15c90 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
15ca0 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
15cb0 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
15cc0 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
15cd0 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
15ce0 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
15cf0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
15d00 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
15d10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15d20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15d30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15d40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15d50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
15d60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
15d70 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
15d80 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
15d90 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
15da0 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
15db0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
15dc0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
15dd0 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
15de0 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
15df0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
15e00 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
15e10 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
15e20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
15e30 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
15e40 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
15e50 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
15e60 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
15e70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
15e80 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
15e90 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
15ea0 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
15eb0 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
15ec0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15ed0 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
15ee0 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
15ef0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15f00 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
15f10 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
15f20 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
15f30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15f40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
15f50 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
15f60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
15f70 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
15f80 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
15f90 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
15fa0 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
15fb0 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
15fc0 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
15fd0 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
15fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15ff0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
16000 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
16010 61 67 65 28 76 29 3b 0a 20 20 20 20 6a 32 20 3d  age(v);.    j2 =
16020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16030 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
16040 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
16050 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
16060 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dst,.           
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
16090 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
160a0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
160b0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
160c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
160d0 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
160e0 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 20 56 64  tinue, j2+2); Vd
160f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16110 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
16120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16130 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
16140 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16150 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16160 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  st-1);.    sqlit
16170 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16180 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
16190 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
161a0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
161b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
161c0 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
161d0 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73 74  ppress the first
161e0 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20   OFFSET entries 
161f0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
16200 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a  FFSET clause.  *
16210 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  /.  codeOffset(v
16220 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
16230 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73  ontinue);..  ass
16240 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
16250 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 3b  t!=SRT_Exists );
16260 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
16270 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62  ->eDest!=SRT_Tab
16280 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  le );.  switch( 
16290 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
162a0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
162b0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
162c0 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
162d0 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
162e0 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
162f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
16300 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16310 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16320 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
16330 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16340 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16360 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16370 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16380 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
16390 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
163b0 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
163c0 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
163d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163e0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
163f0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
16400 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
16410 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16420 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
16430 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
16440 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16450 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
16460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
16470 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16480 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
16490 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
164a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
164b0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
164c0 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
164d0 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
164e0 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
164f0 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
16500 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
16510 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
16520 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
16530 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
16540 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
16550 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
16560 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
16570 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
16580 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
16590 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
165a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
165b0 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
165c0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
165d0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
165e0 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
165f0 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
16600 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
16610 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
16620 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
16630 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16640 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
16650 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
16660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16670 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
16680 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
16690 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
166a0 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
166b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
166c0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
166d0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
166e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
166f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16700 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
16710 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
16720 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16730 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16740 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
16750 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16760 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16770 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
16780 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
16790 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
167a0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
167b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
167c0 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
167d0 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
167e0 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
167f0 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
16800 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
16810 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
16820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16830 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
16840 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
16850 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
16860 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
16870 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16880 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
16890 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
168a0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
168b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
168c0 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
168d0 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
168e0 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
168f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16900 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
16910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16920 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16930 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16940 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16950 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16960 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16970 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16980 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
16990 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
169a0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
169b0 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
169c0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
169d0 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
169e0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
169f0 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16a00 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16a10 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16a20 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16a30 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16a40 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16a50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16a60 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16a70 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16a80 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16a90 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16aa0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
16ab0 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
16ac0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
16ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
16ae0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
16af0 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
16b00 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
16b10 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
16b20 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
16b30 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
16b40 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
16b50 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
16b60 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
16b70 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
16b80 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
16b90 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
16ba0 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
16bb0 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
16bc0 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
16bd0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
16be0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
16bf0 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
16c00 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
16c10 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
16c20 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
16c30 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
16c40 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
16c50 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
16c60 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
16c70 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
16c80 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
16c90 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
16ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16cb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
16cc0 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
16cd0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
16ce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16cf0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16d00 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
16d10 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16d20 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
16d30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
16d40 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
16d50 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
16d60 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
16d70 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
16d80 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
16d90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
16da0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
16db0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
16dc0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
16dd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16de0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
16df0 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
16e00 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
16e10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
16e20 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
16e30 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
16e40 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16e50 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
16e60 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
16e70 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
16e80 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
16e90 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
16ea0 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
16eb0 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
16ec0 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
16ed0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
16ee0 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
16ef0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16f00 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
16f10 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
16f20 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
16f30 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
16f40 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
16f50 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
16f60 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
16f70 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
16f80 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
16f90 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
16fa0 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
16fb0 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
16fc0 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
16fd0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
16fe0 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
16ff0 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
17000 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
17010 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
17020 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
17030 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
17040 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
17050 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
17060 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
17070 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
17080 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
17090 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
170a0 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
170b0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
170c0 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
170d0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
170e0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
170f0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
17100 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
17110 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
17120 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17130 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
17140 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17150 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17160 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17170 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
17180 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
17190 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
171a0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
171b0 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
171c0 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
171d0 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
171e0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
171f0 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
17200 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
17210 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
17220 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
17230 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
17240 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
17250 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
17260 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17270 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
17280 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
17290 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
172a0 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
172b0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
172c0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
172d0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
172e0 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
172f0 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
17300 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17310 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17320 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
17330 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
17340 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
17350 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
17360 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
17370 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
17380 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
17390 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
173a0 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
173b0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
173c0 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
173d0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
173e0 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
173f0 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
17400 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
17410 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
17420 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
17430 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17440 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17450 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17460 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
17470 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17480 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
17490 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
174a0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
174b0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
174c0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
174d0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
174e0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
174f0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
17500 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
17510 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17520 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17530 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
17540 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
17550 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
17560 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17570 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17580 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
17590 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
175a0 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
175b0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
175c0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
175d0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
175e0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
175f0 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
17600 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
17610 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
17620 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
17630 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
17640 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
17650 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
17660 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
17670 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
17680 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
17690 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
176a0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
176b0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
176c0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
176d0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
176e0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
176f0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
17700 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
17710 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
17720 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
17730 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
17740 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
17750 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
17760 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
17770 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
17780 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
17790 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
177a0 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
177b0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
177c0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
177d0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
177e0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
177f0 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
17800 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
17810 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
17820 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
17830 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
17840 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
17850 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
17860 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
17870 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
17880 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
17890 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
178a0 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
178b0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
178c0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
178d0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
178e0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
178f0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
17900 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
17910 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
17920 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
17930 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
17940 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
17950 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
17960 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
17970 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
17980 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
17990 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
179a0 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
179b0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
179c0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
179d0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
179e0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
179f0 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
17a00 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
17a10 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
17a20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
17a30 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
17a40 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
17a50 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
17a60 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
17a70 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
17a80 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
17a90 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
17aa0 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
17ab0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
17ac0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
17ad0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
17ae0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
17af0 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
17b00 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
17b10 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
17b20 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
17b30 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
17b40 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
17b50 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
17b60 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
17b70 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
17b80 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
17b90 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
17ba0 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
17bb0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
17bc0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
17bd0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
17be0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17bf0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
17c00 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
17c10 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
17c20 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
17c30 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
17c40 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
17c50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
17c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17c70 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
17c80 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
17c90 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
17ca0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
17cb0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
17cc0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
17cd0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
17ce0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
17cf0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
17d00 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
17d10 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
17d20 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
17d30 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
17d40 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
17d50 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
17d60 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17d70 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
17d80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
17d90 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
17da0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
17db0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
17dc0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
17dd0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
17de0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
17df0 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
17e00 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
17e10 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
17e20 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
17e30 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
17e40 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
17e50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
17e60 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
17e70 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
17e80 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
17e90 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
17ea0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17eb0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
17ec0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
17ed0 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
17ee0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
17ef0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
17f00 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
17f10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
17f20 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
17f30 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
17f40 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
17f50 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
17f60 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
17f70 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
17f80 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
17f90 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
17fa0 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
17fb0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
17fc0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
17fd0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
17fe0 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
17ff0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18000 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18010 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18020 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
18030 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18040 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
18050 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
18060 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18070 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
18080 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
18090 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
180a0 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
180b0 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
180c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
180d0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
180e0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
180f0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18100 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
18110 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18120 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
18130 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
18140 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18150 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
18160 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18170 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
18180 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18190 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
181a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
181b0 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
181c0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
181d0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
181e0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
181f0 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
18200 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
18210 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
18220 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
18230 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
18240 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
18250 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
18260 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
18270 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
18280 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
18290 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
182a0 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
182b0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
182c0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
182d0 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
182e0 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
182f0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
18300 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
18310 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
18320 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
18330 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
18340 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
18350 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
18360 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
18370 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
18380 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
18390 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
183a0 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
183b0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
183c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
183d0 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
183e0 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
183f0 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
18400 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18410 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
18420 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
18430 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
18440 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
18450 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
18460 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
18470 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
18480 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
18490 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
184a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
184b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
184c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
184d0 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
184e0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
184f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
18500 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
18510 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
18520 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
18530 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
18540 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
18550 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
18560 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
18570 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
18580 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
18590 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
185a0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
185b0 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
185c0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
185d0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
185e0 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
185f0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
18600 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
18610 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
18620 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
18630 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
18640 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
18650 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
18660 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
18670 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
18680 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
18690 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
186a0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
186b0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
186c0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
186d0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
186e0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
186f0 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
18700 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
18710 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
18720 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
18730 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
18740 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
18750 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
18760 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
18770 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
18780 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
18790 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
187a0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
187b0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
187c0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
187d0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
187e0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
187f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
18800 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
18810 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
18820 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
18830 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
18840 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
18850 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
18860 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
18870 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
18880 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
18890 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
188a0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
188b0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
188c0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
188d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
188e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
188f0 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
18900 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
18910 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
18920 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
18930 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
18940 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18950 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
18960 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
18970 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18980 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
18990 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
189a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
189b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
189c0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
189d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
189e0 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
189f0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
18a00 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
18a10 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
18a20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
18a30 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
18a40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18a50 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
18a60 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
18a70 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18a80 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
18a90 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
18aa0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
18ab0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
18ac0 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
18ad0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
18ae0 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
18af0 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
18b00 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
18b10 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
18b20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18b30 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
18b40 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
18b50 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
18b60 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
18b70 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
18b80 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
18b90 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
18ba0 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
18bb0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
18bc0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
18bd0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
18be0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
18bf0 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
18c00 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18c10 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
18c20 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
18c30 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
18c40 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
18c50 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
18c60 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
18c70 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
18c80 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
18c90 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
18ca0 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
18cb0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
18cc0 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
18cd0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
18ce0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
18cf0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
18d00 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
18d10 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
18d20 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
18d30 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
18d40 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18d50 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
18d60 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
18d70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18d80 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  ByCol<=p->pEList
18d90 2d 3e 6e 45 78 70 72 20 29 20 69 73 20 61 6c 73  ->nExpr ) is als
18da0 6f 20 74 72 75 65 0a 20 20 20 20 20 20 2a 2a 20  o true.      ** 
18db0 62 75 74 20 6f 6e 6c 79 20 66 6f 72 20 77 65 6c  but only for wel
18dc0 6c 2d 66 6f 72 6d 65 64 20 53 45 4c 45 43 54 20  l-formed SELECT 
18dd0 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20  statements. */. 
18de0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18df0 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18e00 42 79 43 6f 6c 20 3e 20 70 2d 3e 70 45 4c 69 73  ByCol > p->pELis
18e10 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
18e20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
18e30 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
18e40 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  rByCol - 1;.    
18e50 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
18e60 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
18e70 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
18e80 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c  se, p, 1);.  }el
18e90 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67  se{.    pKeyMerg
18ea0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
18eb0 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52   Reattach the OR
18ec0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f  DER BY clause to
18ed0 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
18ee0 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
18ef0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72   pOrderBy;.  pPr
18f00 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ior->pOrderBy = 
18f10 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
18f20 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
18f30 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20  OrderBy, 0);..  
18f40 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61  /* Allocate a ra
18f50 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  nge of temporary
18f60 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74   registers and t
18f70 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65  he KeyInfo neede
18f80 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c  d.  ** for the l
18f90 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65  ogic that remove
18fa0 73 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75  s duplicate resu
18fb0 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65  lt rows when the
18fc0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69  .  ** operator i
18fd0 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  s UNION, EXCEPT,
18fe0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62   or INTERSECT (b
18ff0 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c  ut not UNION ALL
19000 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  )..  */.  if( op
19010 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
19020 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d  regPrev = 0;.  }
19030 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
19040 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
19050 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65  >nExpr;.    asse
19060 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45  rt( nOrderBy>=nE
19070 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  xpr || db->mallo
19080 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
19090 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
190a0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
190b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78  rse->nMem += nEx
190c0 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  pr+1;.    sqlite
190d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
190e0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
190f0 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79  gPrev);.    pKey
19100 44 75 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Dup = sqlite3Key
19110 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
19120 78 70 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  xpr, 1);.    if(
19130 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
19140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19150 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
19160 62 6c 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a  ble(pKeyDup) );.
19170 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19180 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nExpr; i++){.  
19190 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
191a0 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53  Coll[i] = multiS
191b0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
191c0 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
191d0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f      pKeyDup->aSo
191e0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a  rtOrder[i] = 0;.
191f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19200 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74  }. .  /* Separat
19210 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74  e the left and t
19220 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20 66  he right query f
19230 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a  rom one another.
19240 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72    */.  p->pPrior
19250 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e   = 0;.  pPrior->
19260 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pNext = 0;.  sql
19270 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
19280 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
19290 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
192a0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
192b0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
192c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
192d0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
192e0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
192f0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
19300 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
19310 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
19320 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
19330 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
19340 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
19350 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
19360 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
19370 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
19380 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
19390 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
193a0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
193b0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
193c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
193d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
193e0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
193f0 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
19400 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
19410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
19440 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19450 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
19460 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
19470 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
19480 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
19490 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
194a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
194b0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
194c0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
194d0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
194e0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
194f0 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
19500 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
19510 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
19520 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19530 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61  regAddrB = ++pPa
19540 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
19550 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutA = ++pParse-
19560 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42  >nMem;.  regOutB
19570 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
19580 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  m;.  sqlite3Sele
19590 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
195a0 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  A, SRT_Coroutine
195b0 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73  , regAddrA);.  s
195c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
195d0 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54  Init(&destB, SRT
195e0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
195f0 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
19600 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
19610 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
19620 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
19630 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
19640 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
19650 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
19660 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
19670 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19680 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
19690 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
196a0 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
196b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
196c0 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
196d0 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
196e0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
196f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
19700 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
19710 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
19720 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
19730 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
19740 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
19750 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
19760 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
19770 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
19780 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
19790 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
197a0 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c  OP_EndCoroutine,
197b0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
197c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
197d0 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20  e(v, j1);..  /* 
197e0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
197f0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
19800 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
19810 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
19820 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
19830 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
19840 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
19850 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19860 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
19870 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
19880 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
19890 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
198a0 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrB, 0, addrSel
198b0 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectB);.  VdbeCom
198c0 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68 74 20  ment((v, "right 
198d0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
198e0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
198f0 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
19900 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
19910 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
19920 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
19930 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
19940 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
19950 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
19960 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
19970 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19980 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
19990 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
199a0 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
199b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
199c0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
199d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
199e0 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
199f0 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
19a00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
19a10 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
19a20 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
19a30 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
19a40 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
19a50 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
19a60 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
19a70 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
19a80 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19a90 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
19aa0 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
19ab0 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
19ac0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
19ad0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19af0 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
19b00 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
19b10 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
19b20 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
19b30 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
19b40 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19b50 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
19b60 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
19b70 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
19b80 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
19b90 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
19ba0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
19bb0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
19bc0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
19bd0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
19be0 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19bf0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
19c00 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
19c10 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
19c20 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
19c30 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
19c40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19c50 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
19c60 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
19c80 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
19c90 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
19ca0 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
19cb0 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
19cc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19cd0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
19ce0 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
19cf0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
19d00 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
19d10 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
19d20 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
19d30 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
19d40 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
19d50 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
19d60 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
19d70 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
19d80 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
19d90 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
19da0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
19db0 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
19dc0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
19dd0 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
19de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19df0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
19e00 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
19e10 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
19e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19e30 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
19e40 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
19e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
19e80 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
19e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19ea0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
19eb0 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
19ec0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
19ed0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
19ee0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
19ef0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19f00 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19f10 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19f20 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
19f30 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19f40 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19f50 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
19f60 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
19f70 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
19f80 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
19f90 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
19fa0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
19fb0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
19fc0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
19fd0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
19fe0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
19ff0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a000 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
1a010 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1a020 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
1a030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a040 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a050 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1a060 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a080 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61  ld, regAddrA, la
1a090 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76  belEnd); VdbeCov
1a0a0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1a0b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a0c0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
1a0d0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
1a0e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a0f0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a100 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
1a110 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1a120 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
1a130 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1a140 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
1a150 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a160 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1a170 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
1a180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a190 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1a1a0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1a1b0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1a1c0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a1d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a1e0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
1a1f0 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
1a200 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1a210 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
1a220 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
1a230 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a240 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1a250 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
1a260 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1a270 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
1a280 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
1a290 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
1a2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
1a2b0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a2c0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
1a2d0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
1a2e0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
1a2f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a300 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a310 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62  , addrEofA); Vdb
1a320 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1a330 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a340 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1a350 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
1a360 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a370 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a380 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1a390 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a3a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1a3b0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a3c0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1a3d0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a3e0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1a3f0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1a400 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1a410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a420 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a430 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1a440 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1a450 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a460 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a470 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1a480 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a490 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a4a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a4b0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
1a4c0 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
1a4d0 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
1a4e0 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
1a4f0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
1a500 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a510 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
1a520 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a530 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1a540 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b  , addrEofA_noB);
1a550 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a560 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1a580 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1a590 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1a5a0 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49  rage(v);..  /* I
1a5b0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
1a5c0 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
1a5d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1a5e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1a5f0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
1a600 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a610 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
1a620 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
1a630 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
1a640 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
1a650 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a660 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
1a670 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
1a680 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
1a690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6a0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
1a6b0 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
1a6c0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
1a6d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1a6e0 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
1a6f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a700 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
1a710 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
1a720 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
1a730 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a740 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
1a750 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
1a760 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
1a770 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
1a780 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1a790 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1a7a0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
1a7b0 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
1a7c0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
1a7d0 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
1a7e0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1a7f0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
1a800 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
1a810 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
1a820 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
1a830 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
1a840 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
1a850 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
1a860 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
1a870 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
1a880 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
1a890 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1a8a0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1a8b0 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1a8c0 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1a8d0 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1a8e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1a8f0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1a900 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a910 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1a920 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1a930 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1a940 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1a950 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1a960 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1a970 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1a980 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1a990 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1a9a0 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1a9b0 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
1a9c0 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
1a9d0 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
1a9e0 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
1a9f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1aa00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1aa10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1aa20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1aa30 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1aa40 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
1aa50 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1aa60 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1aa70 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1aa80 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72  t(sqlite3*, Expr
1aa90 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72  List*, int, Expr
1aaa0 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1aab0 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1aac0 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74  sqlite3*, Select
1aad0 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73   *, int, ExprLis
1aae0 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  t *);../*.** Sca
1aaf0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1ab00 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1ab10 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1ab20 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1ab30 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1ab40 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1ab50 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1ab60 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1ab70 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1ab80 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1ab90 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1aba0 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1abb0 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1abc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1abd0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1abe0 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1abf0 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1ac00 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1ac10 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1ac20 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1ac30 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1ac40 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1ac50 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1ac60 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1ac70 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1ac80 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1ac90 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1aca0 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1acb0 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1acc0 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1acd0 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1ace0 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1acf0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1ad00 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1ad10 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1ad20 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1ad30 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1ad40 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1ad50 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1ad60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1ad70 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
1ad80 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
1ad90 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
1ada0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1adb0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
1adc0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
1add0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
1ade0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1adf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1ae00 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
1ae10 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
1ae20 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
1ae30 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
1ae40 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
1ae50 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1ae60 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1ae70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1ae80 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1ae90 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20  ble==iTable ){. 
1aea0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
1aeb0 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
1aec0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1aed0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NULL;.    }else{
1aee0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
1aef0 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  w;.      assert(
1af00 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45   pEList!=0 && pE
1af10 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c  xpr->iColumn<pEL
1af20 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1af30 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1af40 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1af50 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1af60 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
1af70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1af80 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  b, pEList->a[pEx
1af90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1afa0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  pr, 0);.      sq
1afb0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1afc0 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
1afd0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1afe0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1aff0 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
1b000 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b010 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54  pExpr->pLeft, iT
1b020 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b030 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
1b040 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b050 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1b060 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b070 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1b080 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b090 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1b0a0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b0b0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  ct(db, pExpr->x.
1b0c0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
1b0d0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65   pEList);.    }e
1b0e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1b0f0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78  ExprList(db, pEx
1b100 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pr->x.pList, iTa
1b110 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b120 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b130 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1b140 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1b150 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
1b160 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
1b170 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
1b180 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
1b190 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
1b1a0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
1b1b0 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
1b1c0 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1b1d0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
1b1e0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1b1f0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
1b200 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
1b210 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
1b220 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1b230 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
1b240 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b250 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1b260 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1b270 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1b280 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  .    pList->a[i]
1b290 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78  .pExpr = substEx
1b2a0 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
1b2b0 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
1b2c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
1b2d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1b2e0 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
1b2f0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b300 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1b310 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
1b320 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1b330 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1b340 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1b350 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1b360 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1b370 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1b380 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1b390 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
1b3a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1b3b0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
1b3c0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
1b3d0 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
1b3e0 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
1b3f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1b400 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b410 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
1b420 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b430 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
1b440 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1b450 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1b460 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
1b470 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
1b480 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1b490 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
1b4a0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b4b0 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20  .  p->pHaving = 
1b4c0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
1b4d0 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65  >pHaving, iTable
1b4e0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1b4f0 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78  pWhere = substEx
1b500 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  pr(db, p->pWhere
1b510 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b520 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74  );.  substSelect
1b530 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
1b540 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b550 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1b560 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1b570 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f  c );  /* Even fo
1b580 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20  r (SELECT 1) we 
1b590 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75  have: pSrc!=0 bu
1b5a0 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  t pSrc->nSrc==0 
1b5b0 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1b5c0 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72  pSrc) ){.    for
1b5d0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1b5e0 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1b5f0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1b600 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1b610 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ect(db, pItem->p
1b620 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b630 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1b640 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
1b650 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b660 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b670 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b680 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1b690 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1b6a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1b6b0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1b6c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1b6d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b6e0 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1b6f0 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1b700 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1b710 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1b720 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1b730 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1b740 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1b750 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1b760 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1b770 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1b780 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1b790 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1b7a0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1b7b0 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1b7c0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1b7d0 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1b7e0 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1b7f0 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1b800 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1b810 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1b820 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1b830 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1b840 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1b850 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1b860 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1b870 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1b880 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1b890 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1b8a0 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1b8b0 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1b8c0 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1b8d0 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1b8e0 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1b8f0 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1b900 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1b910 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1b920 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1b930 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1b940 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1b950 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1b960 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b970 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1b980 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1b990 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1b9a0 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1b9b0 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1b9c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1b9d0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1b9e0 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1b9f0 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1ba00 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1ba10 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1ba20 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1ba30 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1ba40 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1ba50 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1ba60 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1ba70 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1ba80 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1ba90 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1baa0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1bab0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1bac0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1bad0 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1bae0 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
1baf0 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
1bb00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1bb10 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1bb20 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
1bb30 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
1bb40 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
1bb50 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
1bb60 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
1bb70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bb80 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1bb90 61 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20  ate or (2a) the 
1bba0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1bbb0 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  ot a join.**    
1bbc0 20 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65      and (2b) the
1bbd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1bbe0 73 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65  s not use subque
1bbf0 72 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ries other than 
1bc00 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  the one.**      
1bc10 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75    FROM-clause su
1bc20 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1bc30 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66   candidate for f
1bc40 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20  lattening.  (2b 
1bc50 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65  is.**        due
1bc60 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31   to ticket [2f71
1bc70 37 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66  70d73bf9abf80] f
1bc80 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29  rom 2015-02-09.)
1bc90 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
1bca0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
1bcb0 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
1bcc0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1bcd0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
1bce0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
1bcf0 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
1bd00 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
1bd10 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
1bd20 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1bd30 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
1bd40 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
1bd50 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
1bd60 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
1bd70 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
1bd80 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
1bd90 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
1bda0 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
1bdb0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
1bdc0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
1bdd0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
1bde0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
1bdf0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
1be00 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
1be10 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
1be20 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
1be30 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
1be40 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1be50 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1be60 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1be70 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1be80 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
1be90 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
1bea0 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
1beb0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1bec0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1bed0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1bee0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1bef0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1bf00 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
1bf10 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1bf20 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
1bf30 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
1bf40 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
1bf50 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
1bf60 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
1bf70 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
1bf80 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
1bf90 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1bfa0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1bfb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1bfc0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
1bfd0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
1bfe0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1bff0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c000 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c010 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1c020 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1c030 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1c040 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1c050 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1c060 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1c070 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1c080 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1c090 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1c0a0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1c0b0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1c0c0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1c0d0 20 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20       text: "The 
1c0e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c0f0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1c100 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c110 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1c120 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
1c130 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1c140 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1c150 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c160 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
1c170 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c180 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1c190 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1c1a0 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1c1b0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1c1c0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1c1d0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1c1e0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1c1f0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1c200 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1c210 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1c220 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1c230 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1c240 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
1c250 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
1c260 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c270 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1c280 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
1c290 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c2a0 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
1c2b0 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
1c2c0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
1c2d0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
1c2e0 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
1c2f0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
1c300 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
1c310 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
1c320 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
1c330 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
1c340 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
1c350 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
1c360 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
1c370 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
1c380 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
1c390 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
1c3a0 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
1c3b0 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
1c3c0 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
1c3d0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
1c3e0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
1c3f0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
1c400 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
1c410 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
1c420 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
1c430 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
1c440 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1c450 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
1c460 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
1c470 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1c480 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
1c490 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
1c4a0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1c4b0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
1c4c0 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
1c4d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1c4e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1c4f0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1c500 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
1c510 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
1c520 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1c530 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   join.**.**     
1c540 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
1c550 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
1c560 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
1c570 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
1c580 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
1c590 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
1c5a0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
1c5b0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
1c5c0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
1c5d0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1c5e0 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
1c5f0 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
1c600 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
1c610 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1c620 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
1c630 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
1c640 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
1c650 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1c660 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
1c670 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
1c680 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
1c690 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
1c6a0 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
1c6b0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
1c6c0 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
1c6d0 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
1c6e0 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
1c6f0 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
1c700 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
1c710 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
1c720 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
1c730 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
1c740 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
1c750 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
1c760 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
1c770 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
1c780 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
1c790 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
1c7a0 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
1c7b0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
1c7c0 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
1c7d0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
1c7e0 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
1c7f0 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
1c800 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
1c810 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
1c820 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
1c830 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c840 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1c850 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
1c860 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
1c870 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
1c880 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
1c890 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
1c8a0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1c8b0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
1c8c0 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
1c8d0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
1c8e0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1c8f0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1c900 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1c910 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
1c920 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1c930 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1c940 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1c950 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1c960 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1c970 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1c980 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1c990 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1c9a0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1c9b0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1c9c0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1c9d0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1c9e0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1c9f0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1ca00 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1ca10 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1ca20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1ca30 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1ca40 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1ca50 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1ca60 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1ca70 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1ca80 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1ca90 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1caa0 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1cab0 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
1cac0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1cad0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1cae0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1caf0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1cb00 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
1cb10 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
1cb20 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
1cb30 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1cb40 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
1cb50 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68  .**.**  (23)  Th
1cb60 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20  e parent is not 
1cb70 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
1cb80 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72   or the sub-quer
1cb90 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20  y is not a.**   
1cba0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75       compound qu
1cbb0 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69  ery. This restri
1cbc0 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
1cbd0 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
1cbe0 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
1cbf0 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
1cc00 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
1cc10 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
1cc20 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
1cc30 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
1cc40 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
1cc50 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20  ()..**.**  (24) 
1cc60 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cc70 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1cc80 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
1cc90 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
1cca0 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
1ccb0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
1ccc0 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
1ccd0 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
1cce0 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
1ccf0 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
1cd00 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
1cd10 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
1cd20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
1cd30 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
1cd40 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
1cd50 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
1cd60 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
1cd70 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
1cd80 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
1cd90 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
1cda0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
1cdb0 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
1cdc0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
1cdd0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
1cde0 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
1cdf0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1ce00 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
1ce10 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
1ce20 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
1ce30 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1ce40 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
1ce50 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
1ce60 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
1ce70 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
1ce80 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
1ce90 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
1cea0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1ceb0 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
1cec0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1ced0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
1cee0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
1cef0 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
1cf00 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
1cf10 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
1cf20 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
1cf30 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1cf40 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
1cf50 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
1cf60 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
1cf70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1cf80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1cf90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1cfa0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1cfb0 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
1cfc0 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
1cfd0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
1cfe0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
1cff0 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
1d000 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
1d010 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
1d020 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
1d030 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d040 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
1d050 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1d060 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
1d070 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
1d080 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1d090 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1d0a0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1d0b0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
1d0c0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
1d0d0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
1d0e0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
1d0f0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
1d100 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
1d110 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
1d120 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
1d130 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
1d140 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
1d150 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d160 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
1d170 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
1d180 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1d190 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
1d1a0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1d1b0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1d1c0 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1d1d0 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
1d1e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d1f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
1d200 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
1d210 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
1d220 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1d230 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1d240 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
1d250 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
1d260 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
1d270 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
1d280 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
1d290 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d2a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1d2b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1d2c0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d2e0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1d2f0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1d300 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1d310 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1d320 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1d330 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1d340 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1d350 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1d360 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1d370 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1d380 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1d390 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1d3a0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1d3b0 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
1d3c0 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
1d3d0 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
1d3e0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1d3f0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1d400 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1d410 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1d420 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1d430 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1d440 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1d450 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1d460 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1d470 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1d480 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1d490 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1d4a0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1d4b0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1d4c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1d4d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71  =0 );.  if( subq
1d4e0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1d4f0 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74   if( isAgg ) ret
1d500 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d530 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20  tion (1)   */.  
1d540 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1d550 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1d580 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20  ction (2a)  */. 
1d590 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72     if( (p->pWher
1d5a0 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  e && ExprHasProp
1d5b0 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45  erty(p->pWhere,E
1d5c0 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20  P_Subquery)).   
1d5d0 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1d5e0 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45  rListFlags(p->pE
1d5f0 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75  List) & EP_Subqu
1d600 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ery)!=0.     || 
1d610 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1d620 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42  Flags(p->pOrderB
1d630 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  y) & EP_Subquery
1d640 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1d650 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d690 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20  ion (2b)  */.   
1d6a0 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53   }.  }.    .  pS
1d6b0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1d6c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1d6d0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1d6e0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1d6f0 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1d700 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1d710 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1d720 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1d730 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1d740 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
1d750 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
1d760 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
1d770 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
1d780 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
1d790 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
1d7a0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
1d7b0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1d7c0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
1d7d0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
1d7e0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
1d7f0 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
1d800 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
1d810 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
1d820 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d830 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
1d840 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
1d850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d860 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
1d870 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1d880 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
1d890 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d8b0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
1d8c0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1d8d0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
1d8e0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
1d8f0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
1d900 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d930 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d940 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
1d950 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1d960 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
1d970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d980 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d990 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
1d9a0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1d9b0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1d9c0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1d9d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d9e0 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20  iction (5)  */. 
1d9f0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1da00 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
1da10 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
1da20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1da30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1da40 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
1da50 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
1da60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1da70 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
1da80 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1da90 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1daa0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1dab0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
1dac0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1dad0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
1dae0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
1daf0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1db30 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
1db40 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
1db50 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
1db60 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1db70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1db80 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
1db90 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1dba0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
1dbb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1dbc0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dbd0 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28  on (19) */.  if(
1dbe0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1dbf0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1dc00 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1dc10 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1dc20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1dc30 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f  triction (21) */
1dc40 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
1dc50 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1dc60 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
1dc70 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53  ;.  testcase( pS
1dc80 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1dc90 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
1dca0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
1dcb0 61 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73  ags & (SF_Recurs
1dcc0 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67  ive|SF_MinMaxAgg
1dcd0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1dce0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1dcf0 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29  ns (22) and (24)
1dd00 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1dd10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1dd20 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1dd30 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ub->pPrior ){.  
1dd40 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52    return 0; /* R
1dd50 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20  estriction (23) 
1dd60 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
1dd70 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
1dd80 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
1dd90 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
1dda0 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
1ddb0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1ddc0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
1ddd0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
1dde0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1ddf0 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
1de00 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
1de10 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
1de20 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1de30 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1de40 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1de50 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1de60 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1de70 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1de80 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1de90 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1dea0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1deb0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1dec0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1ded0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1dee0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1def0 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
1df00 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
1df10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
1df20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1df30 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
1df40 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1df50 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
1df60 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1df70 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
1df80 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
1df90 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
1dfa0 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
1dfb0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1dfc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1dfd0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1dfe0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
1dff0 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
1e000 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1e010 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1e020 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1e030 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1e040 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1e050 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
1e060 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
1e070 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
1e080 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
1e090 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
1e0a0 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
1e0b0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
1e0c0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
1e0d0 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
1e0e0 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
1e0f0 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
1e100 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
1e110 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
1e120 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
1e130 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
1e140 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
1e150 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1e160 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
1e170 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
1e180 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
1e190 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
1e1a0 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
1e1b0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1e1c0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
1e1d0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
1e1e0 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
1e1f0 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
1e200 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
1e210 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1e220 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
1e230 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1e240 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1e250 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1e260 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1e270 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1e280 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1e290 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1e2a0 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1e2b0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1e2c0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1e2d0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1e2e0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1e2f0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1e300 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1e310 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1e320 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1e330 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1e340 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1e350 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1e360 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e370 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1e380 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1e390 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1e3a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1e3b0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1e3c0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1e3d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1e3e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1e3f0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1e400 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1e410 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1e420 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1e430 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1e440 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1e450 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1e460 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1e470 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1e480 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1e490 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1e4a0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1e4b0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1e4c0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1e4d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
1e4e0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
1e4f0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
1e500 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
1e510 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
1e520 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
1e530 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
1e540 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
1e550 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
1e560 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
1e570 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1e580 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
1e590 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
1e5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1e5c0 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
1e5d0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
1e5e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
1e5f0 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
1e600 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
1e610 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
1e620 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
1e630 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
1e640 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
1e650 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e660 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
1e670 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
1e680 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1e690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e6a0 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
1e6b0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1e6c0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
1e6d0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
1e6e0 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41  ***/.  SELECTTRA
1e6f0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
1e700 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72  flatten %s.%p fr
1e710 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20  om term %d\n",. 
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65    pSub->zSelName
1e740 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b  , pSub, iFrom));
1e750 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1e760 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1e770 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1e780 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1e790 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1e7a0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1e7b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1e7c0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1e7d0 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1e7e0 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1e7f0 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1e800 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1e810 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1e820 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1e830 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1e840 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1e850 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1e860 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1e870 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1e880 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1e890 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1e8a0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1e8b0 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1e8c0 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1e8d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1e8e0 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1e8f0 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1e900 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1e910 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1e920 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1e930 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1e940 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1e950 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1e960 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1e970 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1e980 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1e990 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1e9a0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1e9b0 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1e9c0 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1e9d0 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1e9e0 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1e9f0 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1ea00 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1ea10 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1ea20 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1ea30 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1ea40 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1ea50 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1ea60 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1ea70 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1ea80 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1ea90 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1eaa0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1eab0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1eac0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1ead0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1eae0 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1eaf0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1eb00 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1eb10 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1eb20 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1eb30 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1eb40 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1eb50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1eb60 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1eb70 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1eb80 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1eb90 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1eba0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ebb0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1ebc0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1ebd0 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1ebe0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1ebf0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1ec00 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1ec10 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1ec20 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1ec30 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1ec40 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1ec50 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1ec60 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1ec70 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1ec80 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1ec90 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1eca0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1ecb0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1ecc0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1ecd0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1ece0 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1ecf0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1ed00 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1ed10 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1ed20 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1ed30 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1ed40 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1ed50 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1ed60 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1ed70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1ed80 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1ed90 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1eda0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1edb0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1edc0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , p, 0);.    sql
1edd0 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
1ede0 65 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53  e(pNew, pSub->zS
1edf0 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  elName);.    p->
1ee00 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1ee10 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1ee20 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1ee30 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1ee40 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1ee50 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1ee60 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1ee70 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1ee80 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1ee90 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1eea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1eeb0 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1eec0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1eed0 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1eee0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1eef0 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1ef00 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1ef10 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1ef20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c    SELECTTRACE(2,
1ef30 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20  pParse,p,.      
1ef40 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75     ("compound-su
1ef50 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
1ef60 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61   creates %s.%p a
1ef70 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20  s peer\n",.     
1ef80 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61      pNew->zSelNa
1ef90 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
1efa0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1efb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1efc0 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1efd0 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1efe0 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1eff0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1f000 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1f010 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f020 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1f030 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1f040 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1f050 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1f060 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1f070 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1f080 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1f090 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1f0a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f0b0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1f0c0 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1f0d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f0e0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1f0f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f100 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1f110 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1f120 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1f130 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1f140 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1f150 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1f160 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1f170 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1f180 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1f190 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1f1a0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f1b0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1f1c0 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1f1d0 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1f1e0 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1f1f0 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1f200 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1f210 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1f220 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1f230 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1f240 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1f250 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1f260 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1f270 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1f280 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1f290 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1f2a0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1f2b0 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1f2c0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1f2d0 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1f2e0 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1f2f0 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1f300 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1f310 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1f320 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1f330 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1f340 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1f350 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1f360 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1f370 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1f380 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1f390 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1f3a0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1f3b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f3c0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1f3d0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1f3e0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1f3f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1f400 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1f410 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1f420 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1f430 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1f440 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1f450 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1f460 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1f470 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1f480 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1f490 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1f4a0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1f4b0 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1f4c0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1f4d0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1f4e0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1f4f0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1f500 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1f510 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1f520 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1f530 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1f540 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1f550 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1f560 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1f570 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1f580 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1f590 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1f5a0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1f5b0 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1f5c0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1f5d0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1f5e0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1f5f0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1f600 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1f610 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1f620 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1f630 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1f640 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1f650 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1f660 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1f670 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1f680 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1f690 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1f6a0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1f6b0 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1f6c0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1f6d0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1f6e0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1f6f0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1f700 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1f710 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1f720 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1f730 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1f740 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1f750 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1f760 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1f770 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1f780 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1f790 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1f7a0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1f7b0 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1f7c0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1f7d0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1f7e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1f7f0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1f800 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1f810 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1f820 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1f830 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1f840 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1f850 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1f860 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1f870 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1f880 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1f890 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1f8a0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1f8b0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1f8c0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1f8d0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1f8e0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1f8f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f900 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1f910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1f920 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1f930 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1f940 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1f950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1f960 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f970 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1f980 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1f990 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1f9a0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1f9b0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1f9c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f9d0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1f9e0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1f9f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1fa00 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1fa10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fa20 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1fa30 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1fa40 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1fa50 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1fa60 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1fa70 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1fa80 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1fa90 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1faa0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1fab0 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1fac0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1fad0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1fae0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1faf0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1fb00 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1fb10 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1fb20 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1fb30 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1fb40 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1fb50 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1fb60 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1fb70 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1fb80 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1fb90 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1fba0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1fbb0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1fbc0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1fbd0 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1fbe0 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1fbf0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1fc00 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1fc10 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1fc20 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1fc30 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1fc40 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1fc50 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1fc60 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1fc70 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1fc80 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1fc90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1fca0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1fcb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1fcc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1fcd0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1fce0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1fcf0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1fd00 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1fd10 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1fd20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1fd30 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1fd40 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1fd50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1fd60 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1fd70 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1fd80 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1fd90 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1fda0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1fdb0 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1fdc0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1fdd0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1fde0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1fdf0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1fe00 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1fe10 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1fe20 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1fe30 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1fe40 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1fe50 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1fe60 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1fe70 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1fe80 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1fe90 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1fea0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1feb0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1fec0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1fed0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1fee0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1fef0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1ff10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1ff20 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1ff30 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1ff40 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1ff50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1ff60 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1ff70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ff80 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1ff90 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1ffa0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1ffb0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1ffc0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1ffd0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1ffe0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1fff0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
20000 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
20010 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
20020 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
20030 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
20040 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
20050 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20060 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
20070 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
20080 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
20090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
200a0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
200b0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
200c0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
200d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
200e0 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
200f0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
20100 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
20110 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
20120 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
20130 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20140 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
20150 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
20160 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
20170 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
20180 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
20190 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
201a0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
201b0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
201c0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
201d0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
201e0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
201f0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
20200 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
20210 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
20220 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rBy ){.      /* 
20230 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61  At this point, a
20240 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64  ny non-zero iOrd
20250 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69  erByCol values i
20260 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20270 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  .      ** ORDER 
20280 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  BY column expres
20290 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61  sion is identica
202a0 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42  l to the iOrderB
202b0 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a  yCol'th.      **
202c0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75   expression retu
202d0 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73  rned by SELECT s
202e0 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53  tatement pSub. S
202f0 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65  ince these value
20300 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  s.      ** do no
20310 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f  t necessarily co
20320 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75  rrespond to colu
20330 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74  mns in SELECT st
20340 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c  atement pParent,
20350 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  .      ** zero t
20360 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73  hem before trans
20370 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52  fering the ORDER
20380 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
20390 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
203a0 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79  t doing this may
203b0 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
203c0 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
203d0 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
203e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61     ** function a
203f0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
20400 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75  en a compound su
20410 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61  b-query into pPa
20420 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74  rent.      ** (t
20430 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73  he only way this
20440 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69   can happen is i
20450 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
20460 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20  ub-query is.    
20470 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70    ** currently p
20480 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72  art of pSub->pSr
20490 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  c). See ticket [
204a0 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f  d11a6e908f].  */
204b0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
204c0 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  *pOrderBy = pSub
204d0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
204e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
204f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
20500 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  +){.        pOrd
20510 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
20520 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
20530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20540 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
20550 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
20560 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
20570 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
20580 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
20590 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
205a0 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
205b0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
205c0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65   }else if( pPare
205d0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  nt->pOrderBy ){.
205e0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
205f0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20600 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65  >pOrderBy, iPare
20610 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
20620 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
20630 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b   pSub->pWhere ){
20640 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
20650 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20660 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c  b, pSub->pWhere,
20670 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
20680 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30        pWhere = 0
20690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
206a0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
206b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
206c0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d  Parent->pHaving=
206d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
206e0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  ent->pHaving = p
206f0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a  Parent->pWhere;.
20700 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20710 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
20720 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20730 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
20740 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
20750 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
20760 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20770 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20780 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
20790 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
207a0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a  rent->pHaving, .
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
207e0 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
207f0 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61  ng, 0));.      a
20800 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
20810 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
20820 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
20830 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
20840 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
20850 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
20860 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
20870 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
20880 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72  here = substExpr
20890 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  (db, pParent->pW
208a0 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70  here, iParent, p
208b0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
208c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
208d0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
208e0 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
208f0 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65  ->pWhere, pWhere
20900 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
20910 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64  /* The flattened
20920 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
20930 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65  ct if either the
20940 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20   inner or the.  
20950 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
20960 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20   is distinct. . 
20970 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e     */.    pParen
20980 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70  t->selFlags |= p
20990 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
209a0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a  SF_Distinct;.  .
209b0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45      /*.    ** SE
209c0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53  LECT ... FROM (S
209d0 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20  ELECT ... LIMIT 
209e0 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49  a OFFSET b) LIMI
209f0 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20  T x OFFSET y;.  
20a00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20    **.    ** One 
20a10 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72  is tempted to tr
20a20 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62  y to add a and b
20a30 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
20a40 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69  limits.  But thi
20a50 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  s.    ** does no
20a60 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72  t work if either
20a70 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
20a80 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ve..    */.    i
20a90 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
20aa0 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
20ab0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d  ->pLimit = pSub-
20ac0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
20ad0 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  Sub->pLimit = 0;
20ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20af0 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74   Finially, delet
20b00 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f  e what is left o
20b10 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61  f the subquery a
20b20 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73  nd return.  ** s
20b30 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  uccess..  */.  s
20b40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
20b50 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a  te(db, pSub1);..
20b60 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
20b70 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
20b80 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
20b90 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
20ba0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
20bb0 74 66 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  tf("After flatte
20bc0 6e 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73  ning:\n");.    s
20bd0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
20be0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
20bf0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
20c00 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
20c10 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
20c20 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
20c30 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
20c40 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
20c50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
20c60 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
20c70 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
20c80 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
20c90 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
20ca0 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
20cb0 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
20cc0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
20cd0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
20ce0 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
20cf0 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
20d00 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
20d10 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
20d20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
20d30 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
20d40 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
20d50 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
20d60 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
20d70 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
20d80 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
20d90 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
20da0 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
20db0 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
20dc0 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
20dd0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
20de0 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
20df0 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
20e00 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
20e10 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
20e20 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
20e30 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
20e40 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
20e50 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
20e60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
20e70 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
20e80 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
20e90 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
20ea0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
20eb0 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
20ec0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
20ed0 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
20ee0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
20ef0 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
20f00 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
20f10 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
20f20 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
20f30 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
20f40 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
20f50 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
20f60 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
20f70 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
20f80 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
20f90 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
20fa0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
20fb0 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
20fc0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
20fd0 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
20fe0 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
20ff0 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
21000 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
21010 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
21020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
21030 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
21040 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
21050 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
21060 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
21070 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
21080 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
21090 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
210a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
210b0 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
210c0 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
210d0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
210e0 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
210f0 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
21100 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21110 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
21120 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
21130 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21140 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21150 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
21160 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
21170 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
21180 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
21190 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
211a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
211b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
211c0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
211d0 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
211e0 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
211f0 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
21200 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
21210 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
21220 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21230 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
21240 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
21250 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
21260 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
21270 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20   aggregate-info 
21280 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a  object. This .**
21290 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20   function tests 
212a0 69 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73  if the SELECT is
212b0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
212c0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75  .**   SELECT cou
212d0 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
212e0 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62  .**.** where tab
212f0 6c 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65  le is a database
21300 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75   table, not a su
21310 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
21320 2e 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a  . If the query.*
21330 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69  * does match thi
21340 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20  s pattern, then 
21350 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21360 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   Table object re
21370 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74  presenting.** <t
21380 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  bl> is returned.
21390 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
213a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
213b0 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69  atic Table *isSi
213c0 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74  mpleCount(Select
213d0 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41   *p, AggInfo *pA
213e0 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65  ggInfo){.  Table
213f0 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a   *pTab;.  Expr *
21400 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74  pExpr;..  assert
21410 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  ( !p->pGroupBy )
21420 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  ;..  if( p->pWhe
21430 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  re || p->pEList-
21440 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c  >nExpr!=1 .   ||
21450 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d   p->pSrc->nSrc!=
21460 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  1 || p->pSrc->a[
21470 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a  0].pSelect.  ){.
21480 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21490 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53  }.  pTab = p->pS
214a0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
214b0 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   pExpr = p->pELi
214c0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
214d0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
214e0 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  & !pTab->pSelect
214f0 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20   && pExpr );..  
21500 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
21510 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
21520 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
21530 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
21540 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
21550 66 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66  f( NEVER(pAggInf
21560 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72  o->nFunc==0) ) r
21570 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
21580 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
21590 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  0].pFunc->funcFl
215a0 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
215b0 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
215c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
215d0 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
215e0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
215f0 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
21600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
21610 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
21620 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
21630 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
21640 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
21650 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
21660 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
21670 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
21680 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
21690 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
216a0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
216b0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
216c0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
216d0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
216e0 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
216f0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
21700 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
21710 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
21720 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
21730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
21740 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
21750 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
21760 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
21770 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
21780 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
21790 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
217a0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
217b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
217c0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
217d0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
217e0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
217f0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
21800 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
21810 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
21820 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
21830 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
21840 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
21850 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
21860 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
21870 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
21880 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
21890 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
218a0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
218b0 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
218c0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
218d0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
218e0 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
218f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21900 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
21910 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
21920 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
21930 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
21940 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
21950 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
21960 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
21970 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
21980 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
21990 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
219a0 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
219b0 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
219c0 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
219d0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
219e0 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
219f0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
21a00 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
21a10 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
21a20 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
21a30 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
21a40 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
21a50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
21a60 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
21a70 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
21a80 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
21a90 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
21aa0 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
21ab0 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
21ac0 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
21ad0 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
21ae0 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
21af0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
21b00 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
21b10 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
21b20 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
21b30 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
21b40 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
21b50 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
21b60 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
21b70 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
21b80 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
21b90 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
21ba0 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
21bb0 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
21bc0 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
21bd0 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
21be0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
21bf0 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
21c00 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
21c10 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
21c20 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
21c30 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
21c40 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
21c50 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
21c60 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
21c70 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
21c80 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
21c90 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
21ca0 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
21cb0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
21cc0 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
21cd0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
21ce0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
21cf0 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
21d00 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
21d10 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
21d20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
21d30 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
21d40 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
21d50 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
21d60 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
21d70 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
21d80 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
21d90 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
21da0 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
21db0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
21dc0 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
21dd0 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
21de0 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
21df0 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
21e00 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
21e10 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
21e20 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
21e30 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
21e40 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
21e50 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
21e60 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
21e70 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
21e80 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
21e90 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
21ea0 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
21eb0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
21ec0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
21ed0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
21ee0 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
21ef0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
21f00 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
21f10 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
21f20 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
21f30 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
21f40 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
21f50 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
21f60 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
21f70 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
21f80 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21f90 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
21fa0 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
21fb0 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
21fc0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
21fd0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
21fe0 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
21ff0 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
22000 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
22010 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22020 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
22030 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
22040 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
22050 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22060 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
22070 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
22080 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20  , TK_ALL, 0));. 
22090 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
220a0 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
220b0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
220c0 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
220d0 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
220e0 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
220f0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
22100 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
22110 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
22120 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
22130 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
22140 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
22150 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22160 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
22170 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
22180 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
22190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
221a0 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
221b0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
221c0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
221d0 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
221e0 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
221f0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
22200 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
22210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22220 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
22230 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
22240 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
22250 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
22260 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
22270 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
22280 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
22290 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
222a0 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
222b0 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
222c0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
222d0 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
222e0 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
222f0 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
22300 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
22310 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
22320 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
22330 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
22340 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
22350 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
22360 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
22370 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
22380 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
22390 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
223a0 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
223b0 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
223c0 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
223d0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
223e0 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
223f0 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
22400 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
22410 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
22420 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48  t outermost WITH
22430 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
22440 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
22450 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
22460 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
22470 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
22480 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
22490 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
224a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
224b0 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
224c0 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
224d0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
224e0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
224f0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
22500 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
22510 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
22520 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
22530 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
22540 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
22550 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
22560 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
22570 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
22580 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
22590 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
225a0 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
225b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
225c0 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
225d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
225e0 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
225f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22600 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22610 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
22620 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
22630 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
22640 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
22650 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
22660 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
22670 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
22680 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
22690 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
226a0 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
226b0 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
226c0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
226d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
226e0 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
226f0 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
22700 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
22710 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
22720 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
22730 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
22740 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
22750 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
22760 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
22770 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
22780 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
22790 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
227a0 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
227b0 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
227c0 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
227d0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
227e0 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
227f0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
22800 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
22810 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
22820 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
22830 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22840 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
22850 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
22860 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50  ( bFree==0 || pP
22870 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29  arse->pWith==0 )
22880 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
22890 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
228a0 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
228b0 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
228c0 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
228d0 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65     pParse->bFree
228e0 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20  With = bFree;.  
228f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
22900 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
22910 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f  if argument pFro
22920 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54  m refers to a CT
22930 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a  E declared by .*
22940 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20  * a WITH clause 
22950 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72  on the stack cur
22960 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65  rently maintaine
22970 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e  d by the parser.
22980 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72   And,.** if curr
22990 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67  ently processing
229a0 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f   a CTE expressio
229b0 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65  n, if it is a re
229c0 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72  cursive.** refer
229d0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72  ence to the curr
229e0 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49  ent CTE..**.** I
229f0 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e  f pFrom falls in
22a00 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  to either of the
22a10 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20   two categories 
22a20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54  above, pFrom->pT
22a30 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  ab.** and other 
22a40 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c  fields are popul
22a50 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
22a60 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  . The caller sho
22a70 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46  uld check.** (pF
22a80 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f  rom->pTab!=0) to
22a90 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
22aa0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63  er or not a succ
22ab0 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20  essful match.** 
22ac0 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  was found..**.**
22ad0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
22ae0 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
22af0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22b00 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
22b10 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49  ror.** occurs. I
22b20 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
22b30 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20  occur, an error 
22b40 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65  message is store
22b50 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73  d in the.** pars
22b60 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f  er and some erro
22b70 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61  r code other tha
22b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  n SQLITE_OK retu
22b90 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
22ba0 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a  int withExpand(.
22bb0 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65    Walker *pWalke
22bc0 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63  r, .  struct Src
22bd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
22be0 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  .){.  Parse *pPa
22bf0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
22c00 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
22c10 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22c20 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20  b;.  struct Cte 
22c30 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20  *pCte;          
22c40 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20       /* Matched 
22c50 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20  CTE (or NULL if 
22c60 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57  no match) */.  W
22c70 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20  ith *pWith;     
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c90 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68  * WITH clause th
22ca0 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20  at pCte belongs 
22cb0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
22cc0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
22cd0 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61  );..  pCte = sea
22ce0 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e  rchWith(pParse->
22cf0 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70  pWith, pFrom, &p
22d00 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74  With);.  if( pCt
22d10 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  e ){.    Table *
22d20 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69  pTab;.    ExprLi
22d30 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
22d40 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20  Select *pSel;.  
22d50 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b    Select *pLeft;
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  /* Left-most SEL
22d80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
22d90 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63  .    int bMayRec
22da0 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
22db0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f     /* True if co
22dc0 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79  mpound joined by
22dd0 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a   UNION [ALL] */.
22de0 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64      With *pSaved
22df0 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
22e00 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
22e10 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57  ue of pParse->pW
22e20 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ith */..    /* I
22e30 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20  f pCte->zErr is 
22e40 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73  non-NULL at this
22e50 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69   point, then thi
22e60 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a  s is an illegal.
22e70 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65      ** recursive
22e80 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54   reference to CT
22e90 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e  E pCte. Leave an
22ea0 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
22eb0 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20   and return.    
22ec0 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74  ** early. If pCt
22ed0 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c  e->zErr is NULL,
22ee0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
22ef0 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
22f00 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
22f10 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
22f20 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
22f30 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b  f( pCte->zErr ){
22f40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
22f50 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70  rorMsg(pParse, p
22f60 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d  Cte->zErr, pCte-
22f70 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
22f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22f90 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  OR;.    }..    a
22fa0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
22fb0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
22fc0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
22fd0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
22fe0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
22ff0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
23000 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
23010 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23020 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
23030 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
23040 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
23050 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
23060 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
23070 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
23080 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
23090 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
230a0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
230b0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
230c0 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
230d0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
230e0 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
230f0 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
23100 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
23110 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
23120 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
23130 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
23140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
23150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23160 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  EM;.    assert( 
23170 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pFrom->pSelect )
23180 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
23190 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63  if this is a rec
231a0 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20  ursive CTE. */. 
231b0 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d     pSel = pFrom-
231c0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d  >pSelect;.    bM
231d0 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20  ayRecursive = ( 
231e0 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  pSel->op==TK_ALL
231f0 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b   || pSel->op==TK
23200 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  _UNION );.    if
23210 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
23220 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
23230 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
23240 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Src = pFrom->pSe
23250 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20  lect->pSrc;.    
23260 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
23270 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
23280 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
23290 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
232a0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
232b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
232c0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
232d0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49   .         && pI
232e0 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20  tem->zName!=0 . 
232f0 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
23300 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74  lite3StrICmp(pIt
23310 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d  em->zName, pCte-
23320 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  >zName).        
23330 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
23340 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  Item->pTab = pTa
23350 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  b;.          pIt
23360 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  em->isRecursive 
23370 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
23380 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  Tab->nRef++;.   
23390 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c         pSel->sel
233a0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75  Flags |= SF_Recu
233b0 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  rsive;.        }
233c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
233d0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20      /* Only one 
233e0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
233f0 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64  nce is permitted
23400 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54  . */ .    if( pT
23410 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20  ab->nRef>2 ){.  
23420 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23430 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
23440 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
23450 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
23460 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
23470 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
23480 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
23490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
234a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
234b0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65  ssert( pTab->nRe
234c0 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e  f==1 || ((pSel->
234d0 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
234e0 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
234f0 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  nRef==2 ));..   
23500 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63   pCte->zErr = "c
23510 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
23520 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
23530 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
23540 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
23550 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
23560 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  h;.    sqlite3Wa
23570 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
23580 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  , bMayRecursive 
23590 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a  ? pSel->pPrior :
235a0 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72   pSel);..    for
235b0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
235c0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
235d0 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
235e0 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
235f0 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
23600 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
23610 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
23620 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
23630 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
23640 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
23650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
23670 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
23680 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
23690 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
236a0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
236b0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
236c0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
236d0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
236e0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
236f0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
23700 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23710 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23720 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
23730 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
23740 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c  ;.    }..    sel
23750 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
23760 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
23770 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
23780 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
23790 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
237a0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
237b0 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
237c0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
237d0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
237e0 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74  te->zErr = "mult
237f0 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
23800 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
23810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23820 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20       pCte->zErr 
23830 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
23840 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
23850 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
23860 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23870 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
23880 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
23890 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20  .    pCte->zErr 
238a0 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
238b0 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
238c0 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
238d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
238e0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
238f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
23900 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
23910 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
23920 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23930 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
23940 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
23950 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
23960 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
23970 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
23980 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
23990 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
239a0 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
239b0 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
239c0 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
239d0 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
239e0 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
239f0 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
23a00 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
23a10 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
23a20 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
23a30 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
23a40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
23a50 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
23a60 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
23a70 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
23a80 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
23a90 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57  ker->pParse;.  W
23aa0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
23ab0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
23ac0 57 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74  With;.  if( pWit
23ad0 68 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  h!=0 ){.    asse
23ae0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
23af0 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
23b00 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
23b10 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20  pWith->pOuter;. 
23b20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
23b30 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
23b40 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
23b50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23b60 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
23b70 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
23b80 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
23b90 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
23ba0 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
23bb0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
23bc0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
23bd0 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
23be0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
23bf0 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
23c00 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
23c10 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
23c20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
23c30 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
23c40 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
23c50 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
23c60 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
23c70 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
23c80 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
23c90 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
23ca0 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
23cb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
23cc0 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
23cd0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
23ce0 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
23cf0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
23d00 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
23d10 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
23d20 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
23d30 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
23d40 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
23d50 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
23d60 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
23d70 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
23d80 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
23d90 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
23da0 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
23db0 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
23dc0 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
23dd0 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
23de0 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
23df0 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
23e00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
23e10 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
23e20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
23e30 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
23e40 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
23e50 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
23e60 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
23e70 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
23e80 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
23e90 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
23ea0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
23eb0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
23ec0 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
23ed0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
23ee0 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
23ef0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
23f00 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
23f10 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
23f20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
23f30 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
23f40 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
23f50 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
23f60 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
23f70 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
23f80 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
23f90 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
23fa0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
23fb0 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
23fc0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
23fd0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
23fe0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
23ff0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
24000 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
24010 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
24020 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24030 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24040 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
24050 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24060 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
24070 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
24080 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
24090 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
240a0 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
240b0 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
240c0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
240d0 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
240e0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
240f0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
24100 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
24110 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
24120 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
24130 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
24140 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
24150 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
24160 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
24170 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61  EList;.  if( pWa
24180 6c 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c  lker->xSelectCal
24190 6c 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f  lback2==selectPo
241a0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
241b0 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
241c0 72 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f  rse, findRightmo
241d0 73 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29  st(p)->pWith, 0)
241e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
241f0 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
24200 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
24210 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
24220 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
24230 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
24240 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
24250 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
24260 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
24270 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
24280 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
24290 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
242a0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
242b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
242c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
242d0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
242e0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
242f0 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
24300 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
24310 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
24320 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
24330 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
24340 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
24350 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
24360 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
24370 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
24380 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
24390 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
243a0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
243b0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
243c0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
243d0 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
243e0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20  pFrom->pTab );. 
243f0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
24400 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
24410 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46  inue;.    if( pF
24420 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
24430 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
24440 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
24450 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
24460 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
24470 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
24480 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
24490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
244a0 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
244b0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
244c0 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74      selectPopWit
244d0 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23  h(pWalker, p);.#
244e0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
244f0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
24500 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
24510 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
24520 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
24530 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
24540 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24550 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
24560 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
24570 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
24580 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
24590 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
245a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
245b0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
245c0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
245d0 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
245e0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
245f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
24600 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
24610 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
24620 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
24630 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
24640 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
24650 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24660 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20  (pWalker, pSel) 
24670 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24680 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  rt;.      pFrom-
24690 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
246a0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
246b0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
246c0 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
246d0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
246e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
246f0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
24700 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
24710 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
24720 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
24730 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a  e_sq_%p", (void*
24740 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
24750 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
24760 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
24770 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
24780 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
24790 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
247a0 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
247b0 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
247c0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
247d0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
247e0 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
247f0 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
24800 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
24810 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
24820 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
24830 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
24840 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
24850 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
24860 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
24870 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
24880 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
24890 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
248a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
248b0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
248c0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
248d0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
248e0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
248f0 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
24900 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
24910 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
24920 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
24930 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d   if( pTab->nRef=
24940 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  =0xffff ){.     
24950 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24960 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
24970 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20  many references 
24980 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36  to \"%s\": max 6
24990 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20  5535",.         
249a0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
249b0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
249c0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
249d0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
249e0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
249f0 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
24a00 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
24a10 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
24a20 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
24a30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
24a40 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
24a50 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
24a60 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
24a70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
24a80 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
24a90 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
24aa0 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
24ab0 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
24ac0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
24ad0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
24ae0 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
24af0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
24b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
24b10 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
24b20 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
24b30 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
24b40 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
24b50 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
24b60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24b70 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
24b80 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
24b90 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
24ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
24bb0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
24bc0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
24bd0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
24be0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
24bf0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
24c00 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
24c10 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
24c20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
24c30 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
24c40 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
24c50 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
24c60 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
24c70 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
24c80 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
24c90 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
24ca0 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
24cb0 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
24cc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
24cd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
24ce0 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
24cf0 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
24d00 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
24d10 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
24d20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
24d30 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
24d40 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
24d50 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
24d60 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
24d70 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
24d80 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
24d90 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
24da0 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
24db0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
24dc0 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
24dd0 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
24de0 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
24df0 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
24e00 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
24e10 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
24e20 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
24e30 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
24e40 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
24e50 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
24e60 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
24e70 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
24e80 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
24e90 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
24ea0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
24eb0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
24ec0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
24ed0 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
24ee0 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
24ef0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
24f00 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
24f10 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
24f20 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
24f30 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
24f40 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
24f50 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
24f60 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
24f70 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
24f80 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ALL ) break;.   
24f90 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
24fa0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
24fb0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
24fc0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
24fd0 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
24fe0 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
24ff0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
25000 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
25010 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
25020 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
25030 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20  _ALL ) break;.  
25040 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
25050 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
25060 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
25070 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
25080 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
25090 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
250a0 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
250b0 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
250c0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
250d0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
250e0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
250f0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
25100 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
25110 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
25120 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
25130 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
25140 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
25150 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
25160 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
25170 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
25180 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
25190 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
251a0 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
251b0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
251c0 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
251e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
251f0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
25200 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
25210 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
25220 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
25230 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
25240 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
25250 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
25260 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25270 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
25280 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
25290 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
252a0 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
252b0 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
252c0 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
252d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
252e0 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
252f0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
25300 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
25310 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25320 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
25330 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
25340 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
25350 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
25360 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
25370 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
25380 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
25390 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
253a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
253b0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
253c0 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
253d0 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
253e0 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
253f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
25400 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
25410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25420 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
25430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25440 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
25450 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
25460 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
25470 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
25480 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
25490 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
254a0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
254b0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
254c0 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
254d0 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
254e0 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
254f0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
25500 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
25510 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
25520 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
25530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
25540 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
25550 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
25560 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
25570 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
25580 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
25590 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
255a0 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
255b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
255c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
255d0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
255e0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
255f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
25600 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
25610 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
25620 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
25630 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
25640 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
25650 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
25660 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
25670 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
25680 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
25690 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
256a0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
256b0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
256c0 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
256d0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
256e0 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
256f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
25700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25710 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
25720 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
25730 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25740 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
25750 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
25760 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
25770 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
25780 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
25790 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
257a0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
257b0 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
257c0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
257d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
257e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
257f0 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
25800 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
25810 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
25820 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
25830 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
25840 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
25850 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
25860 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20  : "*";.         
25870 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72   }.          for
25880 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
25890 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
258a0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
258b0 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  e = pTab->aCol[j
258c0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
258d0 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e       char *zColn
258e0 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  ame;  /* The com
258f0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
25900 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
25910 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20   char *zToFree; 
25920 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74    /* Malloced st
25930 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20  ring that needs 
25940 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
25950 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e             Token
25960 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43   sColname;  /* C
25970 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
25980 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a  ame as a token *
25990 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
259a0 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a  ssert( zName );.
259b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
259c0 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20  zTName && pSub. 
259d0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
259e0 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
259f0 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74  ame(pSub->pEList
25a00 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c  ->a[j].zSpan, 0,
25a10 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20   zTName, 0)==0. 
25a20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
25a30 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
25a40 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
25a50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
25a60 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
25a70 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69  is marked as 'hi
25a80 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c 79  dden' (currently
25a90 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20   only possible. 
25aa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
25ab0 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
25ac0 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64  ), do not includ
25ad0 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70 61  e it in the expa
25ae0 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
25af0 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
25b00 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ist..           
25b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25b20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c 75  if( IsHiddenColu
25b30 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
25b40 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
25b50 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69 72      assert(IsVir
25b60 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20 20  tual(pTab));.   
25b70 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
25b80 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
25b90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
25ba0 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20  ableSeen = 1;.. 
25bb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
25bc0 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
25bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25be0 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
25bf0 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
25c00 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
25c10 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
25c20 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
25c30 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
25c40 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
25c50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
25c70 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
25c80 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
25c90 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25cb0 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
25cc0 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
25cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
25ce0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25d00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25d10 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
25d20 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
25d30 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d50 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
25d60 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
25d70 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
25d80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
25d90 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
25da0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
25db0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
25dc0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
25dd0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25de0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
25df0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25e00 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
25e10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
25e20 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
25e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
25e40 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
25e50 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
25e60 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
25e70 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
25e80 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
25e90 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
25ea0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
25eb0 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
25ec0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
25ed0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
25ee0 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
25ef0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
25f00 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
25f10 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
25f20 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
25f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25f40 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20  if( zSchemaName 
25f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25f60 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
25f70 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
25f80 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a  , zSchemaName);.
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
25fb0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
25fc0 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70  DOT, pLeft, pExp
25fd0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
25fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25ff0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
26000 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
26010 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
26020 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26030 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61  db, "%s.%s", zTa
26040 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bName, zName);. 
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
26060 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d  ToFree = zColnam
26070 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
26080 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
26090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
260a0 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67      pExpr = pRig
260b0 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht;.            
260c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  }.            pN
260d0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
260e0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
260f0 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b  e, pNew, pExpr);
26100 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
26110 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61  lname.z = zColna
26120 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
26130 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c  sColname.n = sql
26140 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
26150 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
26160 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
26170 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
26180 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
26190 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
261a0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
261b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
261c0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
261d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
261e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
261f0 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
26200 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
26210 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
26220 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
26250 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
26260 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
26270 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
26280 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
26290 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
262a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
262b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
262c0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
262d0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
262e0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
262f0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
26330 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
26340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26350 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
26360 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
26370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26380 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
26390 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
263a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
263b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
263c0 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
263d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
263e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
263f0 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
26400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
26410 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
26420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26430 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
26440 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
26450 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
26460 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26470 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26480 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26490 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
264a0 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
264b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
264c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
264d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
264e0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
264f0 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
26500 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
26510 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
26520 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
26530 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
26540 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
26550 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
26560 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
26570 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26580 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
26590 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
265a0 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a  sult set");.  }.
265b0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
265c0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
265d0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
265e0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
265f0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
26600 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
26610 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
26620 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
26630 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
26640 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
26650 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
26660 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
26670 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
26680 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
26690 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
266a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
266b0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
266c0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
266d0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
266e0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
266f0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
26700 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
26710 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
26720 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
26730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26740 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  exprWalkNoop(Wal
26750 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
26760 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
26770 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26780 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
26790 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
267a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
267b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
267c0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
267d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
267e0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
267f0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
26800 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
26810 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
26820 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
26830 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
26840 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
26850 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
26860 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
26870 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
26880 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
26890 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
268a0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
268b0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
268c0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
268d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
268e0 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
268f0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
26900 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
26910 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
26920 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
26930 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
26940 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
26950 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
26960 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
26970 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
26980 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
26990 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
269a0 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
269b0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
269c0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
269d0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
269e0 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
269f0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
26a00 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
26a10 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
26a20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
26a30 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
26a40 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
26a50 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
26a60 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
26a70 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
26a80 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
26a90 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
26aa0 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
26ab0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
26ac0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
26ad0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
26ae0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
26af0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
26b00 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
26b10 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
26b20 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
26b30 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  if( (pSelect->se
26b40 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
26b50 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20  iValue)==0 ){.  
26b60 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
26b70 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
26b80 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  With;.  }.  sqli
26b90 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
26ba0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
26bb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26bc0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
26bd0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
26be0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
26bf0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
26c00 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
26c10 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
26c20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
26c30 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
26c40 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
26c50 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
26c60 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
26c70 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
26c80 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
26c90 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
26ca0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
26cb0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
26cc0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
26cd0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
26ce0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
26cf0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
26d00 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
26d10 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
26d20 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
26d30 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
26d40 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
26d50 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
26d60 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
26d70 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
26d80 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
26d90 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
26da0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
26db0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
26dc0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
26dd0 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
26de0 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
26df0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
26e00 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
26e10 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
26e20 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
26e30 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
26e40 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
26e50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
26e60 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
26e70 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
26e80 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
26e90 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
26ea0 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
26eb0 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
26ec0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
26ed0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
26ee0 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
26ef0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
26f00 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
26f10 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
26f20 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
26f30 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
26f40 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
26f50 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
26f60 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
26f70 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
26f80 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
26f90 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
26fa0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
26fb0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
26fc0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
26fd0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
26fe0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
26ff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
27000 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
27010 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
27020 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
27030 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
27040 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
27050 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
27060 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  or;.          se
27070 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
27080 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
27090 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
270a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
270b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
270c0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
270d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
270e0 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
270f0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27100 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
27110 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
27120 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
27130 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
27140 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
27150 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
27160 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
27170 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
27180 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
27190 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
271a0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
271b0 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
271c0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
271d0 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
271e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
271f0 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
27200 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
27210 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
27220 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
27230 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
27240 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
27250 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
27260 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
27270 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
27280 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
27290 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
272a0 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
272b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
272c0 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20  utine sets up a 
272d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
272e0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
272f0 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
27300 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
27310 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
27320 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
27330 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
27340 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
27350 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
27360 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
27370 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
27380 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
27390 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
273a0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
273b0 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
273c0 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
273d0 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
273e0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
273f0 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
27400 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
27410 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
27420 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
27430 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
27440 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
27450 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
27460 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
27470 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
27480 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
27490 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
274a0 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
274b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
274c0 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
274d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
274e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
274f0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
27500 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
27510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
27520 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
27530 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
27540 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
27550 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
27560 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
27570 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
27580 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
27590 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
275a0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
275b0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
275c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
275d0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
275e0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
275f0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
27600 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
27610 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
27620 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
27630 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
27640 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
27650 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
27660 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65  lite3ResolveSele
27670 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  ctNames(pParse, 
27680 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
27690 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
276a0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
276b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
276c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
276d0 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
276e0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
276f0 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
27700 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
27710 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
27720 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
27730 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
27740 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
27750 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
27760 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
27770 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
27780 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
27790 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
277a0 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
277b0 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
277c0 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
277d0 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
277e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
277f0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
27800 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
27810 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
27820 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
27830 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
27840 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
27850 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
27860 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
27870 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
27880 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
27890 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
278a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
278b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
278c0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
278d0 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
278e0 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
278f0 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
27900 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
27910 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
27920 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
27930 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
27940 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
27950 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
27960 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
27970 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
27980 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
27990 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
279a0 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
279b0 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
279c0 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
279d0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
279e0 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
279f0 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
27a00 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
27a10 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
27a20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
27a30 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
27a40 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
27a50 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
27a60 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
27a70 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
27a80 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
27a90 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
27aa0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
27ab0 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
27ac0 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
27ad0 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
27ae0 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
27af0 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
27b00 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
27b10 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
27b20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
27b30 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
27b40 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
27b50 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
27b60 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27b70 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
27b80 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
27b90 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
27ba0 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
27bb0 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
27bc0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
27bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27be0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
27bf0 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
27c00 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
27c10 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
27c20 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
27c30 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
27c40 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
27c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
27c60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
27c70 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
27c80 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
27c90 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
27ca0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27cb0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
27cc0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
27cd0 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
27ce0 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
27cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d00 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
27d10 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
27d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27d30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
27d40 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
27d50 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
27d60 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
27d70 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
27d80 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
27d90 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
27da0 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
27db0 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
27dc0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
27dd0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
27de0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
27df0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
27e00 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
27e10 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
27e20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
27e30 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
27e40 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
27e50 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
27e60 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
27e70 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
27e80 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
27e90 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
27ea0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
27eb0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
27ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27ed0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
27ee0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
27ef0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
27f00 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
27f30 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
27f40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
27f50 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
27f60 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
27f70 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
27f80 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
27f90 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
27fa0 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
27fb0 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
27fc0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
27fd0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
27fe0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
27ff0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
28000 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
28010 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
28020 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
28030 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
28040 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
28050 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
28060 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
28070 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
28080 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
28090 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
280a0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
280b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
280c0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
280d0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
280e0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
280f0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
28100 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
28110 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
28120 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
28130 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
28140 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
28150 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
28160 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
28170 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
28180 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
28190 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
281a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
281b0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
281c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
281d0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
281e0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
281f0 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43  egAgg, SQLITE_EC
28200 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
28210 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
28220 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
28230 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
28240 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
28250 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
28260 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
28270 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
28280 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
28290 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a  ( nArg==0 );  /*
282a0 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   Error condition
282b0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
282c0 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20  se( nArg>1 );   
282d0 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72  /* Also an error
282e0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69   */.      codeDi
282f0 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
28300 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
28310 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
28320 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
28330 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
28340 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
28350 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
28360 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
28370 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
28380 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
28390 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
283a0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
283b0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
283c0 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
283d0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
283e0 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
283f0 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
28400 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
28410 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
28420 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
28430 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
28440 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
28450 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
28460 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
28470 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
28480 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
28490 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
284a0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
284b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
284c0 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
284d0 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
284e0 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
284f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
28500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28510 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
28520 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
28530 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
28540 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
28550 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
28560 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
28570 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
28580 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
285b0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
285c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
285d0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
285e0 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
285f0 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
28600 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
28610 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
28620 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
28630 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
28640 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
28650 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
28660 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
28670 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
28680 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
28690 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
286a0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
286b0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
286c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
286d0 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
286e0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
286f0 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
28700 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
28710 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
28720 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
28730 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
28740 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
28750 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
28760 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
28770 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
28780 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
28790 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
287a0 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
287b0 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
287c0 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
287d0 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
287e0 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
287f0 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
28800 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
28810 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
28820 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
28830 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
28840 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
28850 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
28860 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
28870 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
28880 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
28890 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
288a0 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
288b0 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
288c0 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
288d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
288e0 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
288f0 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
28900 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28910 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
28920 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28930 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
28940 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
28950 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
28960 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
28970 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
28980 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
28990 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
289a0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
289b0 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
289c0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
289d0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
289e0 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
289f0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
28a00 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
28a10 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
28a20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
28a30 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
28a40 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
28a50 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
28a60 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
28a70 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
28a80 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
28a90 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
28aa0 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
28ab0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
28ac0 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
28ad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28ae0 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
28af0 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
28b00 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
28b10 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
28b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28b30 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
28b40 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
28b70 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
28b80 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ba0 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
28bb0 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
28bc0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
28bd0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
28be0 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
28bf0 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
28c00 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
28c10 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
28c20 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
28c30 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  );.    char *zEq
28c40 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
28c50 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
28c60 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
28c70 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
28c80 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
28c90 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
28ca0 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
28cb0 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
28cc0 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
28cd0 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
28ce0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28cf0 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
28d00 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
28d10 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
28d20 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
28d30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
28d40 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
28d50 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
28d60 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
28d70 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
28d80 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
28d90 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
28da0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28db0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
28dc0 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
28dd0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
28de0 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72  e returned accor
28df0 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65  ding to the Sele
28e00 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
28e10 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
28e20 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
28e30 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66   for further inf
28e40 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
28e50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
28e60 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
28e70 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
28e80 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
28e90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
28ea0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
28eb0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
28ec0 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
28ed0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
28ee0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28ef0 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
28f00 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
28f10 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
28f20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
28f30 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
28f40 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
28f50 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
28f60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
28f70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
28f80 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
28f90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28fb0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
28fc0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
28fd0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
28fe0 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20   *pDest      /* 
28ff0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
29000 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
29010 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
29020 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
29030 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29040 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
29050 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
29060 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
29070 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
29080 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
290a0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
290b0 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
290c0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
290d0 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
290e0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
290f0 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
29100 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
29110 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
29120 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
29130 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
29140 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
29150 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
29160 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
29170 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
29180 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
29190 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
291a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
291b0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
291c0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
291d0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
291e0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
291f0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29200 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
29210 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
29220 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
29230 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29240 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  L */.  int rc = 
29250 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
29260 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
29270 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
29280 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
29290 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
292a0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
292b0 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
292c0 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
292d0 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20   SortCtx sSort; 
292e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
292f0 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
29300 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
29310 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  se */.  AggInfo 
29320 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
29330 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
29340 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
29350 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
29360 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
29370 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
29380 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
29390 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
293a0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
293b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
293c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
293d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
293e0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
293f0 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65  int iRestoreSele
29400 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
29410 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72  SelectId;.  pPar
29420 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20  se->iSelectId = 
29430 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29440 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ectId++;.#endif.
29450 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
29460 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
29470 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29480 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
29490 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
294a0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
294b0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
294c0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
294d0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
294e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
294f0 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
29500 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
29510 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  o));.#if SELECTT
29520 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
29530 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
29540 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54  dent++;.  SELECT
29550 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
29560 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
29570 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66  sing:\n"));.  if
29580 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
29590 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
295a0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
295b0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
295c0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
295d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
295e0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
295f0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
29600 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
29610 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
29620 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
29630 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
29640 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
29650 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
29660 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
29670 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
29680 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29690 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
296a0 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
296b0 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
296c0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
296d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
296e0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
296f0 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
29700 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
29710 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
29720 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
29730 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
29740 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
29750 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
29760 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
29770 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
29780 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
29790 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
297a0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
297b0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
297c0 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
297d0 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
297e0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
297f0 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
29800 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
29810 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
29820 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
29830 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
29840 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
29850 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
29860 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
29870 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
29880 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
29890 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
298a0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
298b0 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
298c0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
298d0 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
298e0 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
298f0 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
29900 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
29910 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
29920 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
29930 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
29940 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
29950 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29960 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
29970 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
29980 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
29990 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
299a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
299b0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
299c0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
299d0 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   );.#if SELECTTR
299e0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
299f0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
29a00 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
29a10 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
29a20 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
29a30 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
29a40 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
29a50 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
29a60 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
29a70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  );.  }.#endif...
29a80 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
29a90 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
29aa0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
29ab0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
29ac0 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
29ad0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
29ae0 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
29af0 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
29b00 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
29b10 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
29b20 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
29b30 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
29b40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
29b50 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
29b60 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
29b70 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
29b80 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73  se, pDest, pELis
29b90 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
29ba0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
29bb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
29bc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
29bd0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
29be0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
29bf0 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
29c00 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
29c10 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
29c20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
29c30 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
29c40 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
29c50 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
29c60 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
29c70 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
29c80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
29c90 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
29ca0 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
29cb0 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
29cc0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
29cd0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
29ce0 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
29cf0 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
29d00 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
29d10 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f  Sometimes the co
29d20 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
29d30 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  y will be genera
29d40 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ted more than.  
29d50 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68    ** once, if th
29d60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61  e subquery is pa
29d70 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
29d80 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54  clause in a LEFT
29d90 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f   JOIN,.    ** fo
29da0 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74  r example.  In t
29db0 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74  hat case, do not
29dc0 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20   regenerate the 
29dd0 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  code to manifest
29de0 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f  .    ** a view o
29df0 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  r the co-routine
29e00 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
29e10 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74  view.  The first
29e20 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a   instance.    **
29e30 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20   is sufficient, 
29e40 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f  though the subro
29e50 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73  utine to manifes
29e60 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20  t the view does 
29e70 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
29e80 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e  e invoked again.
29e90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
29ea0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29  m->addrFillSub )
29eb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
29ec0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  m->viaCoroutine=
29ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
29ee0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
29ef0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
29f00 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
29f10 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
29f20 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
29f30 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
29f40 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
29f50 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
29f60 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
29f70 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
29f80 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
29f90 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
29fa0 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
29fb0 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
29fc0 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
29fd0 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
29fe0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
29ff0 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2a000 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2a010 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2a020 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2a030 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2a040 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2a050 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2a060 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2a070 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2a080 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2a090 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2a0a0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2a0b0 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2a0c0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2a0d0 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69  eight(p);..    i
2a0e0 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
2a0f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2a100 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
2a110 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
2a120 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
2a130 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
2a140 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sub) ){.      /*
2a150 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
2a160 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
2a170 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
2a180 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41  */.      if( isA
2a190 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  ggSub ){.       
2a1a0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
2a1b0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2a1c0 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2a1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a1e0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
2a1f0 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
2a200 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2a210 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
2a220 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 0a 20  s & SF_All)==0. 
2a230 20 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74            && Opt
2a240 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2a250 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71  (db, SQLITE_Subq
2a260 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29  Coroutine).    )
2a270 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65  {.      /* Imple
2a280 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e  ment a co-routin
2a290 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75  e that will retu
2a2a0 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  rn a single row 
2a2b0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
2a2c0 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61      ** set on ea
2a2d0 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20  ch invocation.. 
2a2e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
2a2f0 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69  t addrTop = sqli
2a300 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2a310 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70  dr(v)+1;.      p
2a320 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2a330 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a350 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2a360 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
2a370 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
2a380 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
2a390 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2a3a0 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
2a3b0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2a3c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
2a3d0 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
2a3e0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
2a3f0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
2a400 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
2a410 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
2a420 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
2a430 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2a440 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2a450 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
2a460 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
2a470 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2a480 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2a490 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
2a4a0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2a4b0 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33  LogEst = sqlite3
2a4c0 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65  LogEst(pSub->nSe
2a4d0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
2a4e0 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  pItem->viaCorout
2a4f0 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ine = 1;.      p
2a500 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20  Item->regResult 
2a510 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
2a520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a530 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
2a540 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2a550 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2a560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2a570 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
2a580 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
2a590 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2a5a0 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2a5b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2a5c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
2a5d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2a5e0 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
2a5f0 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
2a600 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
2a610 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
2a620 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
2a630 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
2a640 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
2a650 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
2a660 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
2a670 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
2a680 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
2a690 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
2a6a0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
2a6b0 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
2a6c0 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
2a6d0 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
2a6e0 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
2a6f0 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
2a700 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
2a710 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
2a720 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61  assert( pItem->a
2a730 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b  ddrFillSub==0 );
2a740 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2a750 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2a760 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a770 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
2a780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2a790 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49  P_Integer, 0, pI
2a7a0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2a7b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
2a7c0 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41  drFillSub = topA
2a7d0 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  ddr+1;.      if(
2a7e0 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c   pItem->isCorrel
2a7f0 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ated==0 ){.     
2a800 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2a810 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72  query is not cor
2a820 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
2a830 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
2a840 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
2a850 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
2a860 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
2a870 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
2a880 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
2a890 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
2a8a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
2a8b0 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  eAddr = sqlite3C
2a8c0 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
2a8d0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2a8e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2a8f0 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2a900 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2a910 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2a920 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  me));.      }els
2a930 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e  e{.        VdbeN
2a940 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
2a950 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2a960 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2a970 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2a980 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2a990 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2a9a0 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
2a9b0 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
2a9c0 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  or);.      expla
2a9d0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
2a9e0 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
2a9f0 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
2aa00 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
2aa10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2aa20 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2aa30 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
2aa40 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  ->pTab->nRowLogE
2aa50 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
2aa60 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  st(pSub->nSelect
2aa70 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Row);.      if( 
2aa80 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
2aa90 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2aaa0 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
2aab0 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
2aac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2aad0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
2aae0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2aaf0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2ab00 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
2ab10 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2ab20 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
2ab30 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
2ab40 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
2ab50 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
2ab60 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
2ab70 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
2ab80 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50    }.    if( /*pP
2ab90 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20  arse->nErr ||*/ 
2aba0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2abb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
2abc0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
2abd0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2abe0 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
2abf0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2ac00 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
2ac10 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2ac20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
2ac30 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2ac40 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2ac50 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2ac60 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
2ac70 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2ac80 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
2ac90 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
2aca0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
2acb0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
2acc0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
2acd0 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
2ace0 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
2acf0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2ad00 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
2ad10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
2ad20 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
2ad30 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
2ad40 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
2ad50 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
2ad60 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
2ad70 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
2ad80 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
2ad90 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
2ada0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
2adb0 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53  t);.    explainS
2adc0 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
2add0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
2ade0 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
2adf0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2ae00 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45  ENABLED.    SELE
2ae10 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
2ae20 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e  ,p,("end compoun
2ae30 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  d-select process
2ae40 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50  ing\n"));.    pP
2ae50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
2ae60 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
2ae70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2ae80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2ae90 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49   the query is DI
2aea0 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f  STINCT with an O
2aeb0 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e  RDER BY but is n
2aec0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c  ot an aggregate,
2aed0 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68   and .  ** if th
2aee0 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73  e select-list is
2aef0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
2af00 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20   ORDER BY list, 
2af10 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a  then this query.
2af20 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72    ** can be rewr
2af30 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50  itten as a GROUP
2af40 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f   BY. In other wo
2af50 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  rds, this:.  **.
2af60 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2af70 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f  DISTINCT xyz FRO
2af80 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78  M ... ORDER BY x
2af90 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20  yz.  **.  ** is 
2afa0 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a  transformed to:.
2afb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2afc0 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e  LECT xyz FROM ..
2afd0 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f  . GROUP BY xyz O
2afe0 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2aff0 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
2b000 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
2b010 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
2b020 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
2b030 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
2b040 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
2b050 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
2b060 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
2b070 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
2b080 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
2b090 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
2b0a0 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
2b0b0 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
2b0c0 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
2b0d0 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
2b0e0 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
2b0f0 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
2b100 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
2b110 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
2b120 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
2b130 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2b140 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
2b150 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
2b160 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
2b170 69 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74  istCompare(sSort
2b180 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45  .pOrderBy, p->pE
2b190 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
2b1a0 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
2b1b0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2b1c0 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  t;.    p->pGroup
2b1d0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
2b1e0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
2b1f0 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70  EList, 0);.    p
2b200 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
2b210 6f 75 70 42 79 3b 0a 20 20 20 20 2f 2a 20 4e 6f  oupBy;.    /* No
2b220 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
2b230 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
2b240 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
2b250 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
2b260 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
2b270 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2b280 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
2b290 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
2b2a0 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
2b2b0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
2b2c0 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
2b2d0 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
2b2e0 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
2b2f0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
2b300 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
2b310 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20  isTnct );.  }.. 
2b320 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2b330 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2b340 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f  se, then this so
2b350 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  rting.  ** index
2b360 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
2b370 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
2b380 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
2b390 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
2b3a0 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
2b3b0 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
2b3c0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
2b3d0 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70  e.  ** OP_OpenEp
2b3e0 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
2b3f0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
2b400 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
2b410 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
2b420 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
2b430 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2b440 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
2b450 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
2b460 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
2b470 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
2b480 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
2b490 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
2b4a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2b4b0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
2b4c0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
2b4d0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2b4e0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2b4f0 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2b500 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  y, 0, pEList->nE
2b510 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  xpr);.    sSort.
2b520 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
2b530 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
2b540 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2b550 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
2b560 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2b570 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2b580 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72  ,.          sSor
2b590 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72  t.iECursor, sSor
2b5a0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2b5b0 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r+1+pEList->nExp
2b5c0 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
2b5d0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2b5e0 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20   P4_KEYINFO.    
2b5f0 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2b600 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2b610 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
2b620 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
2b630 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
2b640 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
2b650 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
2b660 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
2b670 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
2b680 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
2b690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b6a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
2b6b0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
2b6c0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69  t->iSDParm, pELi
2b6d0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
2b6e0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
2b6f0 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
2b700 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2b710 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2b720 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2b730 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
2b740 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
2b750 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
2b760 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  , iEnd);.  if( p
2b770 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73  ->iLimit==0 && s
2b780 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2b790 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
2b7a0 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
2b7b0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
2b7c0 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  ndex)->opcode = 
2b7d0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20  OP_SorterOpen;. 
2b7e0 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61     sSort.sortFla
2b7f0 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55  gs |= SORTFLAG_U
2b800 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
2b810 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
2b820 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
2b830 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
2b840 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
2b850 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2b860 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
2b870 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
2b880 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
2b890 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
2b8a0 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
2b8b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2b8c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
2b8d0 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
2b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8f0 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
2b900 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b930 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f  char*)keyInfoFro
2b940 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2b950 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29  , p->pEList,0,0)
2b960 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
2b990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2b9a0 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
2b9b0 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
2b9c0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2b9d0 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2b9e0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
2b9f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
2ba00 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2ba10 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2ba20 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
2ba30 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
2ba40 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
2ba50 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
2ba60 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
2ba70 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2ba80 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
2ba90 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
2baa0 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
2bab0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
2bac0 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42   : 0);..    /* B
2bad0 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
2bae0 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70  e scan. */.    p
2baf0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2bb00 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2bb10 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
2bb20 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  re, sSort.pOrder
2bb30 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
2bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb50 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63     p->pEList, wc
2bb60 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  trlFlags, 0);.  
2bb70 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
2bb80 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2bb90 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  d;.    if( sqlit
2bba0 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77  e3WhereOutputRow
2bbb0 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20  Count(pWInfo) < 
2bbc0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b  p->nSelectRow ){
2bbd0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
2bbe0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68  tRow = sqlite3Wh
2bbf0 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
2bc00 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  t(pWInfo);.    }
2bc10 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e  .    if( sDistin
2bc20 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c  ct.isTnct && sql
2bc30 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2bc40 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  nct(pWInfo) ){. 
2bc50 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65       sDistinct.e
2bc60 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74  TnctType = sqlit
2bc70 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
2bc80 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  t(pWInfo);.    }
2bc90 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70  .    if( sSort.p
2bca0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
2bcb0 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20   sSort.nOBSat = 
2bcc0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2bcd0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20  dered(pWInfo);. 
2bce0 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e       if( sSort.n
2bcf0 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72  OBSat==sSort.pOr
2bd00 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
2bd10 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
2bd20 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2bd30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2bd40 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
2bd50 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
2bd60 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
2bd70 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2bd80 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
2bd90 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
2bda0 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
2bdb0 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
2bdc0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
2bdd0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
2bde0 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
2bdf0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64     if( sSort.add
2be00 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
2be10 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d   sSort.pOrderBy=
2be20 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2be30 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2be40 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2be50 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2be60 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
2be70 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
2be80 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73  r loop. */.    s
2be90 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2bea0 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
2beb0 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
2bec0 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
2bed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bee0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2bef0 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70  eContinueLabel(p
2bf00 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  WInfo),.        
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2bf20 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
2bf30 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20  el(pWInfo));..  
2bf40 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
2bf50 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
2bf60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
2bf70 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2bf80 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
2bf90 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
2bfa0 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
2bfb0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
2bfc0 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
2bfd0 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
2bfe0 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
2bff0 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
2c000 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
2c010 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
2c020 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
2c030 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
2c040 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
2c050 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
2c060 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
2c070 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
2c080 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
2c090 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
2c0a0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
2c0b0 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
2c0c0 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
2c0d0 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
2c0e0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
2c0f0 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
2c100 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
2c110 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c130 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
2c140 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
2c150 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
2c160 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2c180 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
2c190 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
2c1a0 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
2c1b0 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
2c1c0 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
2c1d0 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
2c1e0 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
2c1f0 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
2c200 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
2c210 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
2c220 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
2c230 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
2c240 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
2c250 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
2c260 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
2c270 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
2c280 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
2c290 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
2c2a0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
2c2b0 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
2c2c0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
2c2d0 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
2c2e0 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
2c2f0 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
2c300 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
2c310 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
2c320 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
2c330 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
2c340 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
2c350 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
2c360 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
2c370 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
2c380 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2c390 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c3a0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
2c3b0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3d0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2c3e0 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
2c3f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2c400 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
2c410 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
2c420 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
2c430 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
2c440 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
2c450 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
2c460 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
2c470 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2c480 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
2c490 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
2c4a0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
2c4b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
2c4c0 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
2c4d0 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
2c4e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
2c4f0 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
2c500 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2c510 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
2c520 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65  Row>100 ) p->nSe
2c530 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20  lectRow = 100;. 
2c540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c550 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2c560 31 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  1;.    }...    /
2c570 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
2c580 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
2c590 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
2c5a0 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
2c5b0 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63  e.    ** identic
2c5c0 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  al, then it may 
2c5d0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  be possible to d
2c5e0 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
2c5f0 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20   BY clause .    
2c600 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64  ** on the ground
2c610 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  s that the GROUP
2c620 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65   BY will cause e
2c630 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
2c640 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74  out .    ** in t
2c650 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
2c660 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f  . It also may no
2c670 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59  t - the GROUP BY
2c680 20 6d 61 79 20 75 73 65 20 61 0a 20 20 20 20 2a   may use a.    *
2c690 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  * database index
2c6a0 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
2c6b0 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20  s to be grouped 
2c6c0 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71 75  together as requ
2c6d0 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20  ired.    ** but 
2c6e0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72  not actually sor
2c6f0 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ted. Either way,
2c700 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
2c710 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
2c720 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
2c730 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 61  OUP BY clauses a
2c740 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20 73  re the same by s
2c750 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72  etting the order
2c760 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72  ByGrp.    ** var
2c770 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  iable.  */.    i
2c780 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
2c790 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70  stCompare(pGroup
2c7a0 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  By, sSort.pOrder
2c7b0 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
2c7c0 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d      orderByGrp =
2c7d0 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20   1;.    }. .    
2c7e0 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
2c7f0 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
2c800 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
2c810 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
2c820 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
2c830 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2c840 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
2c850 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
2c860 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
2c870 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
2c880 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
2c890 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
2c8a0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
2c8b0 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
2c8c0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
2c8d0 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
2c8e0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
2c8f0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
2c900 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
2c910 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
2c920 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
2c930 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
2c940 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
2c950 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
2c960 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
2c970 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
2c980 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
2c990 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
2c9a0 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
2c9b0 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
2c9c0 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 73  nExpr : 0;.    s
2c9d0 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
2c9e0 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
2c9f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2ca00 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2ca10 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
2ca20 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2ca30 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 53  AggList(&sNC, sS
2ca40 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20  ort.pOrderBy);. 
2ca50 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
2ca60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ca70 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2ca80 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
2ca90 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
2caa0 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
2cab0 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
2cac0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
2cad0 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2cae0 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
2caf0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2cb00 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
2cb10 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
2cb20 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2cb30 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
2cb40 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49  .ncFlags |= NC_I
2cb50 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20  nAggFunc;.      
2cb60 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2cb70 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2cb80 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2cb90 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
2cba0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2cbb0 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67  lags &= ~NC_InAg
2cbc0 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20  gFunc;.    }.   
2cbd0 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20   sAggInfo.mxReg 
2cbe0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
2cbf0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2cc00 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2cc10 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
2cc20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
2cc30 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
2cc40 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
2cc50 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
2cc60 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
2cc70 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
2cc80 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
2cc90 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
2cca0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2ccb0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2ccc0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2ccd0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
2cce0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
2ccf0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
2cd00 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
2cd10 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
2cd20 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
2cd30 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
2cd40 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
2cd50 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
2cd60 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
2cd70 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
2cd80 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
2cd90 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
2cda0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
2cdb0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2cdc0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
2cdd0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
2cde0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
2cdf0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
2ce00 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
2ce10 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
2ce20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
2ce30 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
2ce40 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
2ce50 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
2ce60 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
2ce70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
2ce80 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
2ce90 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2cea0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
2ceb0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
2cec0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
2ced0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
2cee0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
2cef0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
2cf00 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2cf10 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
2cf20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
2cf30 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
2cf40 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
2cf50 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
2cf60 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
2cf70 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
2cf80 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
2cf90 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
2cfa0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
2cfb0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
2cfc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
2cfd0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
2cfe0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
2cff0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
2d000 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
2d010 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
2d020 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
2d030 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
2d040 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2d050 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
2d060 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
2d070 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
2d080 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2d090 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2d0a0 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c  0, sAggInfo.nCol
2d0b0 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72  umn);.      addr
2d0c0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
2d0d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2d0e0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
2d0f0 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
2d100 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2d110 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
2d120 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
2d130 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
2d140 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2d150 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
2d160 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
2d170 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
2d180 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
2d190 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
2d1a0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
2d1b0 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
2d1c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2d1d0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
2d1e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d1f0 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
2d200 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
2d210 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
2d220 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
2d230 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2d240 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
2d250 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
2d260 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
2d270 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
2d280 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2d290 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
2d2a0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2d2b0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2d2c0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2d2d0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
2d2e0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2d2f0 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
2d300 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
2d310 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2d320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d330 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2d340 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
2d350 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2d360 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
2d370 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2d380 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d390 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2d3a0 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
2d3b0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2d3c0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
2d3d0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
2d3e0 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
2d3f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d400 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
2d410 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
2d420 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
2d430 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
2d440 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
2d450 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
2d460 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
2d470 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
2d480 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2d490 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
2d4a0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
2d4b0 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
2d4c0 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
2d4d0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2d4e0 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
2d4f0 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
2d500 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
2d510 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
2d520 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
2d530 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
2d540 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
2d550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d560 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2d570 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2d580 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
2d590 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2d5a0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2d5b0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
2d5c0 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
2d5d0 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  .          WHERE
2d5e0 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65  _GROUPBY | (orde
2d5f0 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53  rByGrp ? WHERE_S
2d600 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c  ORTBYGROUP : 0),
2d610 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
2d620 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
2d630 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2d640 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  d;.      if( sql
2d650 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
2d660 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f  ed(pWInfo)==pGro
2d670 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  upBy->nExpr ){. 
2d680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
2d690 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
2d6a0 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
2d6b0 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
2d6c0 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
2d6d0 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
2d6e0 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
2d6f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
2d700 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
2d710 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
2d720 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
2d730 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
2d740 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
2d750 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d760 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2d770 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
2d780 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
2d790 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
2d7a0 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
2d7b0 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
2d7c0 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
2d7d0 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
2d7e0 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
2d7f0 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
2d800 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
2d810 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
2d820 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
2d830 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
2d840 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
2d850 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
2d860 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
2d870 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d880 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
2d890 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
2d8a0 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
2d8b0 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
2d8c0 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
2d8d0 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65         explainTe
2d8e0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
2d8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44  .            (sD
2d900 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
2d910 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53  & (p->selFlags&S
2d920 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20  F_Distinct)==0) 
2d930 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
2d940 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22        "DISTINCT"
2d950 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a   : "GROUP BY");.
2d960 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
2d970 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
2d980 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
2d990 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2d9a0 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
2d9b0 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a  oupBy;.        j
2d9c0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
2d9d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2d9e0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2d9f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2da00 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
2da10 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
2da20 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2da30 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
2da40 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2da50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2da60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2da70 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
2da80 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2da90 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2daa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2dab0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2dac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2dad0 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2dae0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2daf0 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
2db00 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2db10 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
2db20 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2db30 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2db40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2db50 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2db60 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
2db70 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
2db80 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2db90 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
2dba0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2dbb0 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
2dbc0 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
2dbd0 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
2dbe0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
2dbf0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
2dc00 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2dc30 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
2dc40 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
2dc50 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
2dc60 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
2dc70 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
2dc80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2dc90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
2dca0 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
2dcb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dcc0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2dcd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2dce0 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2dcf0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2dd00 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2dd10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2dd20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2dd30 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2dd40 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2dd50 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2dd60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2dd70 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2dd80 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2dd90 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2dda0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2ddb0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2ddc0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2ddd0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2dde0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2ddf0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2de00 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2de10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2de20 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2de30 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2de40 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2de50 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2de60 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2de70 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2de80 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2de90 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2dea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2deb0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2dec0 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2ded0 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2dee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2def0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2df00 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2df10 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2df20 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2df30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2df40 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2df50 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
2df60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2df70 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
2df80 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
2df90 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2dfa0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2dfb0 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  );..      }..   
2dfc0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
2dfd0 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  ex or temporary 
2dfe0 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 74 68  table used by th
2dff0 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a  e GROUP BY sort.
2e000 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61        ** will na
2e010 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20  turally deliver 
2e020 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65  rows in the orde
2e030 72 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  r required by th
2e040 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20  e ORDER BY.     
2e050 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63   ** clause, canc
2e060 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  el the ephemeral
2e070 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65   table open code
2e080 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20  d earlier..     
2e090 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69   **.      ** Thi
2e0a0 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
2e0b0 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65  tion - the corre
2e0c0 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64  ct answer should
2e0d0 20 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65   result regardle
2e0e0 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65  ss..      ** Use
2e0f0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
2e100 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
2e110 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
2e120 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20  RL_OPTIMIZER to 
2e130 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c  .      ** disabl
2e140 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  e this optimizat
2e150 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ion for testing 
2e160 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20  purposes.  */.  
2e170 20 20 20 20 69 66 28 20 6f 72 64 65 72 42 79 47      if( orderByG
2e180 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  rp && Optimizati
2e190 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2e1a0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2e1b0 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 28 67  r) .       && (g
2e1c0 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71  roupBySort || sq
2e1d0 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72 74  lite3WhereIsSort
2e1e0 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20  ed(pWInfo)).    
2e1f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f    ){.        sSo
2e200 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2e210 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e220 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
2e230 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2e240 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
2e250 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
2e260 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
2e270 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2e280 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
2e290 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
2e2a0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
2e2b0 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
2e2c0 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
2e2d0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
2e2e0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
2e2f0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
2e300 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2e310 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
2e320 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
2e330 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
2e340 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
2e350 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2e360 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
2e370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2e380 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
2e390 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2e3a0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2e3b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2e3c0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2e3d0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2e3e0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2e3f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2e400 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
2e410 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2e420 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 2c 73  ngIdx, sortOut,s
2e430 6f 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20  ortPTab);.      
2e440 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2e450 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
2e460 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
2e470 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2e480 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
2e490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2e4a0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2e4b0 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
2e4c0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  m+j);.        }e
2e4d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2e4e0 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
2e4f0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2e500 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2e510 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
2e520 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
2e530 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2e540 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e560 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
2e570 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
2e580 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e5a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2e5b0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
2e5c0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
2e5d0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2e5e0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
2e5f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2e600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e610 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2e620 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
2e630 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  j1+1); VdbeCover
2e640 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
2e650 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2e660 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
2e670 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
2e680 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
2e690 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
2e6a0 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
2e6b0 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
2e6c0 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
2e6d0 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
2e6e0 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
2e6f0 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
2e700 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
2e710 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e720 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
2e730 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
2e740 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
2e750 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
2e760 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
2e770 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
2e780 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
2e790 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2e7a0 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
2e7b0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2e7c0 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
2e7d0 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
2e7e0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
2e7f0 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
2e800 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
2e810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2e820 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
2e830 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
2e840 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
2e850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e860 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2e870 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2e880 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2e890 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2e8a0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2e8b0 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
2e8c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e8d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2e8e0 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
2e8f0 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
2e900 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2e910 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2e920 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
2e930 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2e940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e950 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2e960 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2e970 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2e980 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
2e990 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2e9a0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2e9b0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2e9c0 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
2e9d0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
2e9e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
2e9f0 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
2ea00 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2ea10 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2ea20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
2ea30 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2ea40 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2ea50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ea60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2ea70 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
2ea80 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2ea90 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2eaa0 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
2eab0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2eac0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
2ead0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
2eae0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2eaf0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2eb00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2eb10 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2eb20 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
2eb30 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
2eb40 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
2eb50 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
2eb60 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
2eb70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2eb80 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2eb90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2eba0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2ebb0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
2ebc0 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
2ebd0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
2ebe0 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
2ebf0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
2ec00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ec10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2ec20 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2ec30 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2ec40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ec50 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2ec60 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
2ec70 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
2ec80 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
2ec90 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
2eca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ecb0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2ecc0 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
2ecd0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2ece0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2ecf0 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
2ed00 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2ed10 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2ed20 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
2ed30 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
2ed40 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
2ed50 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
2ed60 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
2ed70 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2ed80 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
2ed90 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
2eda0 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
2edb0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
2edc0 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
2edd0 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
2ede0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2edf0 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
2ee00 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
2ee10 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
2ee20 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
2ee30 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
2ee40 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
2ee50 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
2ee60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2ee70 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
2ee80 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2ee90 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2eea0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2eeb0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2eec0 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
2eed0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2eee0 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
2eef0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2ef00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ef10 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2ef20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2ef30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ef40 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2ef50 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2ef60 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2ef70 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2ef80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2ef90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2efa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2efb0 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
2efc0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
2efd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2efe0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2eff0 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
2f000 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
2f010 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
2f020 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f030 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f040 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2f050 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
2f060 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2f070 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2f080 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2f090 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2f0a0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
2f0b0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
2f0c0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2f0d0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2f0e0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2f0f0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2f100 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
2f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f120 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
2f130 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
2f150 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
2f160 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
2f170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f180 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f190 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2f1a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2f1b0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
2f1c0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2f1d0 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
2f1e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
2f1f0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
2f200 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
2f210 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
2f220 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
2f230 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
2f240 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
2f250 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
2f260 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
2f270 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2f280 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2f290 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2f2a0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
2f2b0 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
2f2c0 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
2f2d0 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
2f2e0 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
2f2f0 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
2f300 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
2f310 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
2f320 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
2f330 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
2f340 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
2f350 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
2f360 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
2f370 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
2f380 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
2f390 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
2f3a0 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
2f3b0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
2f3c0 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
2f3d0 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
2f3e0 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
2f3f0 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
2f400 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
2f410 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2f420 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2f430 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
2f440 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
2f450 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
2f460 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
2f470 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
2f480 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
2f490 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2f4a0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
2f4b0 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
2f4c0 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
2f4d0 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
2f4e0 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
2f4f0 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
2f500 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
2f510 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
2f520 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
2f530 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
2f540 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
2f550 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
2f560 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
2f570 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
2f580 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
2f590 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
2f5a0 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
2f5b0 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
2f5c0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
2f5d0 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
2f5e0 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
2f5f0 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
2f600 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
2f610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
2f620 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
2f630 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
2f640 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
2f650 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
2f660 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2f670 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
2f680 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
2f690 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
2f6a0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
2f6b0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6d0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2f6e0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2f6f0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2f700 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
2f710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
2f720 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
2f730 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
2f740 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
2f750 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f760 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
2f770 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
2f780 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
2f790 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
2f7a0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
2f7b0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
2f7c0 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
2f7d0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
2f7e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2f7f0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2f800 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
2f810 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2f820 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2f830 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2f840 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
2f850 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
2f860 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
2f870 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
2f880 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
2f890 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2f8a0 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
2f8b0 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
2f8c0 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
2f8d0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2f8e0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
2f8f0 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
2f900 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
2f910 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
2f920 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
2f930 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
2f940 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
2f950 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
2f960 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
2f970 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
2f980 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
2f990 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
2f9a0 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
2f9b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2f9c0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
2f9d0 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
2f9e0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2f9f0 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2fa00 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
2fa10 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
2fa20 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
2fa30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2fa40 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
2fa50 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
2fa60 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
2fa70 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
2fa80 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
2fa90 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
2faa0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
2fab0 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
2fac0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
2fad0 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
2fae0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2faf0 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
2fb00 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
2fb10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fb20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
2fb30 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
2fb40 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
2fb50 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
2fb60 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
2fb70 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
2fb80 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
2fb90 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
2fba0 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
2fbb0 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
2fbc0 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
2fbd0 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
2fbe0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2fbf0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2fc00 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
2fc10 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
2fc20 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
2fc30 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
2fc40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fc50 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
2fc60 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
2fc70 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2fc80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fc90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fca0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
2fcb0 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
2fcc0 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
2fcd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fce0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2fcf0 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
2fd00 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2fd10 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
2fd20 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
2fd30 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2fd40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2fd50 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
2fd60 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2fd70 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
2fd80 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
2fd90 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2fda0 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
2fdb0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2fdc0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
2fdd0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2fde0 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
2fdf0 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
2fe00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2fe10 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
2fe20 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
2fe30 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
2fe40 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
2fe50 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
2fe60 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
2fe70 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
2fe80 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
2fe90 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
2fea0 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
2feb0 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
2fec0 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
2fed0 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
2fee0 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
2fef0 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
2ff00 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
2ff10 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
2ff20 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
2ff30 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
2ff40 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
2ff50 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
2ff60 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
2ff70 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
2ff80 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2ff90 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
2ffa0 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
2ffb0 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
2ffc0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
2ffd0 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
2ffe0 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
2fff0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
30000 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
30010 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
30020 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
30030 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
30040 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
30050 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
30060 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
30070 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30080 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
30090 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
300a0 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
300b0 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
300c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
300d0 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
300e0 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
300f0 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
30100 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
30110 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
30120 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
30130 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
30140 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
30150 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
30160 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
30170 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
30180 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
30190 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
301a0 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
301b0 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
301c0 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
301d0 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
301e0 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
301f0 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
30200 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
30210 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
30220 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
30230 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
30240 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
30250 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
30260 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
30270 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
30280 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
30290 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
302a0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
302b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
302c0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
302d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
302e0 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
302f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
30300 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
30310 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
30320 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
30330 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
30340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30350 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
30360 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
30370 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
30380 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
30390 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
303a0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
303b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
303c0 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
303d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
303e0 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
303f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69           if( pMi
30400 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
30410 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
30420 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
30430 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
30440 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
30450 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
30460 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
30470 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
30480 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
30490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
304a0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
304b0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
304c0 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
304d0 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
304e0 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
304f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
30500 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
30510 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
30520 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
30530 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
30540 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
30550 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30560 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
30570 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
30580 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
30590 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
305a0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
305b0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
305c0 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66  ere, pMinMax,0,f
305d0 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
305e0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
305f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30600 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
30610 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
30620 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
30630 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
30640 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
30650 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
30660 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
30670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
30680 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
30690 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
306a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
306b0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
306c0 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b  red(pWInfo)>0 ){
306d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
306e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
306f0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
30700 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
30710 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20  el(pWInfo));.   
30720 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
30730 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
30740 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
30750 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
30760 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
30770 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
30780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30790 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
307a0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
307b0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
307c0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
307d0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
307e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72     }..      sSor
307f0 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
30800 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
30810 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
30820 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
30830 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
30840 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
30850 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
30860 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
30870 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  t, -1, 0, 0, .  
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30890 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
308a0 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
308b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
308c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
308d0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
308e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
308f0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
30900 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
30910 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
30920 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
30930 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
30940 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
30950 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
30960 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
30970 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
30980 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
30990 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
309a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
309b0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
309c0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
309d0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
309e0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
309f0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
30a00 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
30a10 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
30a20 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
30a30 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 73  pTable(pParse, s
30a40 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20  Sort.nOBSat>0 ? 
30a50 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f  "RIGHT PART OF O
30a60 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20  RDER BY":"ORDER 
30a70 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
30a80 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
30a90 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45  e, p, &sSort, pE
30aa0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
30ab0 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
30ac0 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
30ad0 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
30ae0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
30af0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
30b00 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
30b10 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
30b20 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65 20 69  oded. If there i
30b30 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  s an error in th
30b40 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
30b50 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  e,.  ** set the 
30b60 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31  return code to 1
30b70 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a  . Otherwise 0. *
30b80 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73 65  /.  rc = (pParse
30b90 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a  ->nErr>0);..  /*
30ba0 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
30bb0 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
30bc0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
30bd0 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
30be0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
30bf0 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
30c00 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
30c10 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69  ct_end:.  explai
30c20 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
30c30 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
30c40 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
30c50 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79  ;..  /* Identify
30c60 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66   column names if
30c70 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
30c80 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65  SELECT are to be
30c90 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20   output..  */.  
30ca0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30cb0 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73  K && pDest->eDes
30cc0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
30cd0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
30ce0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
30cf0 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
30d00 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  t);.  }..  sqlit
30d10 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
30d20 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
30d30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
30d40 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
30d50 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
30d60 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45  E_ENABLED.  SELE
30d70 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
30d80 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73  ,p,("end process
30d90 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72  ing\n"));.  pPar
30da0 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
30db0 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t--;.#endif.  re
30dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
30dd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
30de0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
30df0 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
30e00 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61  description of a
30e10 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
30e20 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
30e30 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
30e40 74 28 54 72 65 65 56 69 65 77 20 2a 70 56 69 65  t(TreeView *pVie
30e50 77 2c 20 63 6f 6e 73 74 20 53 65 6c 65 63 74 20  w, const Select 
30e60 2a 70 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c  *p, u8 moreToFol
30e70 6c 6f 77 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  low){.  int n = 
30e80 30 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c  0;.  pView = sql
30e90 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
30ea0 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f  (pView, moreToFo
30eb0 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33  llow);.  sqlite3
30ec0 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
30ed0 65 77 2c 20 22 53 45 4c 45 43 54 25 73 25 73 20  ew, "SELECT%s%s 
30ee0 28 30 78 25 70 29 20 73 65 6c 46 6c 61 67 73 3d  (0x%p) selFlags=
30ef0 30 78 25 78 22 2c 0a 20 20 20 20 28 28 70 2d 3e  0x%x",.    ((p->
30f00 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
30f10 73 74 69 6e 63 74 29 20 3f 20 22 20 44 49 53 54  stinct) ? " DIST
30f20 49 4e 43 54 22 20 3a 20 22 22 29 2c 0a 20 20 20  INCT" : ""),.   
30f30 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   ((p->selFlags &
30f40 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 3f   SF_Aggregate) ?
30f50 20 22 20 61 67 67 5f 66 6c 61 67 22 20 3a 20 22   " agg_flag" : "
30f60 22 29 2c 20 70 2c 20 70 2d 3e 73 65 6c 46 6c 61  "), p, p->selFla
30f70 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d  gs.  );.  if( p-
30f80 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
30f90 2d 3e 6e 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20  ->nSrc ) n++;.  
30fa0 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20  if( p->pWhere ) 
30fb0 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47  n++;.  if( p->pG
30fc0 72 6f 75 70 42 79 20 29 20 6e 2b 2b 3b 0a 20 20  roupBy ) n++;.  
30fd0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
30fe0 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
30ff0 4f 72 64 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20  OrderBy ) n++;. 
31000 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
31010 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
31020 4f 66 66 73 65 74 20 29 20 6e 2b 2b 3b 0a 20 20  Offset ) n++;.  
31030 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
31040 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 54 72  n++;.  sqlite3Tr
31050 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70  eeViewExprList(p
31060 56 69 65 77 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  View, p->pEList,
31070 20 28 6e 2d 2d 29 3e 30 2c 20 22 72 65 73 75 6c   (n--)>0, "resul
31080 74 2d 73 65 74 22 29 3b 0a 20 20 69 66 28 20 70  t-set");.  if( p
31090 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
310a0 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69  c->nSrc ){.    i
310b0 6e 74 20 69 3b 0a 20 20 20 20 70 56 69 65 77 20  nt i;.    pView 
310c0 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
310d0 77 50 75 73 68 28 70 56 69 65 77 2c 20 28 6e 2d  wPush(pView, (n-
310e0 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
310f0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
31100 56 69 65 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20  View, "FROM");. 
31110 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
31120 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
31130 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
31140 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
31150 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
31160 61 5b 69 5d 3b 0a 20 20 20 20 20 20 53 74 72 41  a[i];.      StrA
31170 63 63 75 6d 20 78 3b 0a 20 20 20 20 20 20 63 68  ccum x;.      ch
31180 61 72 20 7a 4c 69 6e 65 5b 31 30 30 5d 3b 0a 20  ar zLine[100];. 
31190 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
311a0 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20  ccumInit(&x, 0, 
311b0 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
311c0 69 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  ine), 0);.      
311d0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
311e0 78 2c 20 30 2c 20 22 7b 25 64 2c 2a 7d 22 2c 20  x, 0, "{%d,*}", 
311f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
31200 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
31210 2d 3e 7a 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ->zDatabase ){. 
31220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
31230 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25  rintf(&x, 0, " %
31240 73 2e 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 44  s.%s", pItem->zD
31250 61 74 61 62 61 73 65 2c 20 70 49 74 65 6d 2d 3e  atabase, pItem->
31260 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
31270 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
31280 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
31290 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
312a0 78 2c 20 30 2c 20 22 20 25 73 22 2c 20 70 49 74  x, 0, " %s", pIt
312b0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
312c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
312d0 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
312e0 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
312f0 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 74 61 62  ntf(&x, 0, " tab
31300 6e 61 6d 65 3d 25 51 22 2c 20 70 49 74 65 6d 2d  name=%Q", pItem-
31310 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
31320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31330 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
31340 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31350 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
31360 22 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65  " (AS %s)", pIte
31370 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
31380 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
31390 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
313a0 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20  JT_LEFT ){.     
313b0 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
313c0 66 28 26 78 2c 20 30 2c 20 22 20 4c 45 46 54 2d  f(&x, 0, " LEFT-
313d0 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  JOIN");.      }.
313e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
313f0 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
31400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
31410 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
31420 2c 20 7a 4c 69 6e 65 2c 20 69 3c 70 2d 3e 70 53  , zLine, i<p->pS
31430 72 63 2d 3e 6e 53 72 63 2d 31 29 3b 20 0a 20 20  rc->nSrc-1); .  
31440 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
31450 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
31460 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31470 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70  wSelect(pView, p
31480 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 30  Item->pSelect, 0
31490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
314a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
314b0 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20  Pop(pView);.    
314c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  }.    sqlite3Tre
314d0 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
314e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
314f0 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
31500 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
31510 70 56 69 65 77 2c 20 22 57 48 45 52 45 22 2c 20  pView, "WHERE", 
31520 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71  (n--)>0);.    sq
31530 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
31540 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 57 68 65  r(pView, p->pWhe
31550 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
31560 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
31570 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28  View);.  }.  if(
31580 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
31590 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
315a0 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65  iewExprList(pVie
315b0 77 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20  w, p->pGroupBy, 
315c0 28 6e 2d 2d 29 3e 30 2c 20 22 47 52 4f 55 50 42  (n--)>0, "GROUPB
315d0 59 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Y");.  }.  if( p
315e0 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ->pHaving ){.   
315f0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31600 49 74 65 6d 28 70 56 69 65 77 2c 20 22 48 41 56  Item(pView, "HAV
31610 49 4e 47 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  ING", (n--)>0);.
31620 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31630 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
31640 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20  ->pHaving, 0);. 
31650 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31660 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20  ewPop(pView);.  
31670 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
31680 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
31690 65 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69  e3TreeViewExprLi
316a0 73 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 4f 72  st(pView, p->pOr
316b0 64 65 72 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20  derBy, (n--)>0, 
316c0 22 4f 52 44 45 52 42 59 22 29 3b 0a 20 20 7d 0a  "ORDERBY");.  }.
316d0 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
316e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
316f0 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
31700 2c 20 22 4c 49 4d 49 54 22 2c 20 28 6e 2d 2d 29  , "LIMIT", (n--)
31710 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
31720 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
31730 65 77 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 30  ew, p->pLimit, 0
31740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31750 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
31760 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
31770 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71  Offset ){.    sq
31780 6c 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65  lite3TreeViewIte
31790 6d 28 70 56 69 65 77 2c 20 22 4f 46 46 53 45 54  m(pView, "OFFSET
317a0 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20  ", (n--)>0);.   
317b0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
317c0 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70  Expr(pView, p->p
317d0 4f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Offset, 0);.    
317e0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
317f0 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20  op(pView);.  }. 
31800 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
31810 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
31820 20 2a 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 22 3b   *zOp = "UNION";
31830 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e  .    switch( p->
31840 6f 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  op ){.      case
31850 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 20   TK_ALL:        
31860 20 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 20 41 4c   zOp = "UNION AL
31870 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  L";  break;.    
31880 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
31890 45 43 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 4e  ECT:   zOp = "IN
318a0 54 45 52 53 45 43 54 22 3b 20 20 62 72 65 61 6b  TERSECT";  break
318b0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  ;.      case TK_
318c0 45 58 43 45 50 54 3a 20 20 20 20 20 20 7a 4f 70  EXCEPT:      zOp
318d0 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
318e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
318f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31900 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4f 70  wItem(pView, zOp
31910 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
31920 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
31930 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 2d 3e  elect(pView, p->
31940 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
31950 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31960 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20  op(pView);.  }. 
31970 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31980 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65  Pop(pView);.}.#e
31990 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
319a0 45 42 55 47 20 2a 2f 0a                          EBUG */.