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

Artifact 66c2fce5d5a413915c2c3d989e2bc00e5e905f00:


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 61 73 73 65 72 74  New) );.  assert
0ee0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ef0: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0f00: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0f10: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0f20: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0f30: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0f40: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0f50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f60: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
0f70: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0f80: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0f90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
0fa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0fb0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0fc0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0fd0: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0fe0: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0ff0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
1000: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
1010: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1020: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1030: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1040: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1050: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1060: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1070: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1080: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1090: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
10a0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
10b0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
10c0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
10d0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10e0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10f0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1100: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
1110: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1120: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1130: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1140: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1150: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
1160: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1170: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1180: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1190: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [1] = -1;.  if( 
11a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11b0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
11c0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70  lect(db, pNew, p
11d0: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a  New!=&standin);.
11e0: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
11f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1200: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
1210: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1220: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
1230: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
1240: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
1250: 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45  New;.}..#if SELE
1260: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
1280: 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f  me of a Select o
1290: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
12a0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
12b0: 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f  me(Select *p, co
12c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61  {.  if( p && zNa
12e0: 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
12f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1300: 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20  f(p->zSelName), 
1310: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73  p->zSelName, "%s
1320: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  ", zName);.  }.}
1330: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1340: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
1350: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
1360: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
1370: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
1380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1390: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
13a0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
13b0: 2a 70 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65  *p){.  clearSele
13c0: 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a  ct(db, p, 1);.}.
13d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
13e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  pointer to the r
13f0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
1400: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20   statement in a 
1410: 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  compound..*/.sta
1420: 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64  tic Select *find
1430: 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74  Rightmost(Select
1440: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
1450: 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d  ->pNext ) p = p-
1460: 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  >pNext;.  return
1470: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1480: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
1490: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
14a0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
14b0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
14c0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
14d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
14e0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
14f0: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
1500: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
1510: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
1520: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
1530: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
1540: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
1550: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
1560: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
1570: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
1580: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
1590: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
15a0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
15b0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
15c0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
15d0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
15e0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
15f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1600: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
1610: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
1620: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
1630: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
1640: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1650: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1660: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
1670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1680: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
1690: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
16a0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
16b0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
16c0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
16d0: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
1700: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
1710: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
1720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1730: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
1740: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
1750: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
1760: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1770: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
1780: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
1790: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
17a0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
17b0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
17c0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
17d0: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
17e0: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
17f0: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1800: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1810: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1820: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1830: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1840: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1850: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1860: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
1870: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
1880: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
1890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
18a0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
18b0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
18e0: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
18f0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1900: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1910: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1920: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1930: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1940: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1950: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1960: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
1970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1980: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
1990: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
19a0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
19b0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
19c0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
19d0: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
19e0: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
19f0: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1a00: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1a10: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1a20: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1a30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1a40: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1a50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1a60: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
1a70: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1a80: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a90: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
1aa0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
1ab0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
1ac0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1ad0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1ae0: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b10: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1b20: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1b30: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1b40: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1b50: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1b60: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1b70: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
1b80: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
1b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
1bb0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
1bc0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bd0: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1be0: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1bf0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1c00: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1c10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c20: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1c30: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1c40: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1c50: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1c60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c70: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1c80: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1c90: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1ca0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
1cb0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
1cc0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1cd0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1ce0: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1cf0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1d00: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1d10: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1d20: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1d30: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d50: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1d60: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
1d70: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
1d80: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
1d90: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
1da0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
1dc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1dd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1de0: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1df0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1e00: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1e10: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1e20: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e40: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1e50: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
1e70: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e80: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
1e90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1ea0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
1eb0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
1ec0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1ed0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1ee0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1ef0: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1f00: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1f10: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1f20: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1f30: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1f40: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1f50: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1f60: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
1f70: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
1f80: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
1f90: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
1fa0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
1fb0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
1fc0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1fd0: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1fe0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1ff0: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
2000: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
2010: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
2020: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2030: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
2040: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
2050: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2070: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
2080: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
2090: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
20a0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
20b0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
20c0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
20d0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
20e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
20f0: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
2100: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
2110: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2130: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2140: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
2150: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
2160: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2180: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
21a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21c0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
21d0: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
21e0: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
21f0: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
2200: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
2210: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
2220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
2230: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
2240: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
2250: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
2260: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
2270: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
2280: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
2290: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
22a0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
22b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
22c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
22f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2300: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
2310: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
2320: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
2330: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
2340: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
2350: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2360: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
2370: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
2380: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
2390: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
23a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
23c0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
23d0: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
23e0: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
23f0: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
2400: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
2410: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
2420: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
2430: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
2440: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
2450: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
2460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
2470: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
2480: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
2490: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
24a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2500: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
2510: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
2520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2530: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2540: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
2550: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
2560: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
2570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2580: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2590: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
25a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
25b0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25d0: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
25e0: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
25f0: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2620: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
2630: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
2640: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2660: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
2670: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
2680: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
26b0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
26c0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
26d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26e0: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
26f0: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
2700: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
2710: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
2720: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2730: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
2740: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
2750: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
2760: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
2770: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
2780: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
2790: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
27a0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27b0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
27c0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
27d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
27e0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
27f0: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2800: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2810: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2820: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2830: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2840: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2850: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2860: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2870: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2880: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2890: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
28a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
28b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
28c0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
28d0: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
28e0: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
28f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2900: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2910: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2930: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2940: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2950: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2960: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2970: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2980: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2990: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
29a0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
29b0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
29c0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
29d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
29e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
29f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2a00: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2a10: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2a20: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2a30: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2a40: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2a50: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2a60: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2a70: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2a80: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2a90: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2aa0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2ab0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2ac0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2ad0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2ae0: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2af0: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2b00: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2b10: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2b20: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2b30: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2b40: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2b50: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2b60: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b70: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2b80: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2b90: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
2ba0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2bb0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
2bc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2bd0: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2be0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2bf0: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2c00: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2c10: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2c20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2c30: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2c40: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2c50: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2c60: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
2c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2c80: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
2c90: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
2ca0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
2cb0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
2cc0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2cd0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2ce0: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2cf0: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2d00: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2d10: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2d20: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2d30: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2d40: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2d50: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2d60: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
2d70: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
2d80: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
2d90: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
2da0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
2db0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
2dc0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2dd0: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2de0: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2df0: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2e00: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2e10: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2e20: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2e30: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2e40: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2e50: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2e60: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2e70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2e80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
2e90: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2ea0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2eb0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2ec0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2ed0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2ee0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2ef0: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2f00: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2f10: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2f20: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f40: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2f50: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2f60: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
2f70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2f80: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2f90: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
2fa0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
2fb0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2fc0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2fd0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2fe0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2ff0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
3000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
3010: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
3020: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
3030: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
3040: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
3050: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
3060: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
3070: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
3080: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
3090: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
30a0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
30b0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
30c0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
30d0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
30e0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
30f0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
3100: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
3110: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
3120: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
3130: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
3140: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
3150: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
3160: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
3170: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
3180: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
3190: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
31a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31b0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31c0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
31d0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
31e0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
31f0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
3200: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
3210: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
3240: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3250: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
3260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3270: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3280: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
3290: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32a0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
32b0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
32c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
32d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32e0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
32f0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
3300: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
3310: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
3320: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
3330: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
3340: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3360: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
3370: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
3380: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
3390: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
33a0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
33b0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
33c0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
33d0: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
33e0: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
33f0: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
3400: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
3410: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
3420: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
3430: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3440: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3450: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3460: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3470: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3480: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3490: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
34a0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
34b0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
34c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34d0: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
34e0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
34f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3500: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
3510: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
3540: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
3550: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
3560: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3570: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3580: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3590: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
35a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
35b0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
35c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
35d0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
35e0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
35f0: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3600: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3610: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
3620: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
3630: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3640: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
3650: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
3660: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3670: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3680: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3690: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
36a0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
36b0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
36c0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
36d0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
36e0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
36f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3700: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3710: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
3720: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3740: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3750: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3770: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3780: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3790: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
37a0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
37b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
37c0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
37d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
37e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
37f0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3800: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3810: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3820: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3830: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3850: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3860: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3870: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3880: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3890: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
38a0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
38b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38c0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
38d0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
38e0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
38f0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3900: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3910: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3920: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3930: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3940: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3950: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3960: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3970: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3980: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3990: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
39a0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
39b0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
39c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
39d0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
39e0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
39f0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a00: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3a10: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3a20: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3a30: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3a40: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3a50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3a60: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3a70: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3a80: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3a90: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3aa0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3ab0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3ac0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3ad0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3ae0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3af0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b00: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3b10: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3b20: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3b30: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3b50: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3b70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3b80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3b90: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3ba0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3bb0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3bc0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3bd0: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3be0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c00: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3c10: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c20: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c30: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3c40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3c50: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3c60: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3c70: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3c80: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3ca0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3cb0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3cc0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3cd0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3cf0: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d00: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3d10: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3d20: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3d30: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3d40: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3d60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d70: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3d80: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3d90: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3da0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3db0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3dc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3dd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3df0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e00: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3e10: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3e20: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3e50: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3e60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3e70: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3e80: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3e90: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3ea0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3eb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3ec0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3ed0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3ef0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3f10: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3f20: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3f30: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3f40: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3f50: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3f60: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
3f70: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
3f80: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
3f90: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
3fa0: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
3fb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3fc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
3fd0: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
3fe0: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
3ff0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4000: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
4010: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
4030: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
4040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4050: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
4060: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4070: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4080: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4090: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
40a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
40b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
40c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
40d0: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
40e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
40f0: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4100: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4110: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4120: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
4130: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4150: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4160: 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61  in the data arra
4170: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  y */.  int nPref
4180: 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  ixReg         /*
4190: 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f   No. of reg prio
41a0: 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61  r to regData ava
41b0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
41c0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
41d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20          /* Stmt 
4200: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4210: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71  on */.  int bSeq
4220: 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74   = ((pSort->sort
4230: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
4240: 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b  _UseSorter)==0);
4250: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
4260: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
4270: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
4280: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52      /* No. of OR
4290: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
42a0: 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45    int nBase = nE
42b0: 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61  xpr + bSeq + nDa
42c0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
42d0: 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20     /* Fields in 
42e0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
42f0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20      /* Regs for 
4330: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4340: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
4350: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64      /* Assembled
4380: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4390: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  /.  int nOBSat =
43a0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20   pSort->nOBSat; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
43d0: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
43e0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
4410: 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72   to add sorter r
4420: 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20  ecord to sorter 
4430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
4440: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
4450: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
4460: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4470: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4480: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4490: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
44a0: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
44b0: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
44c0: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
44d0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
44e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
44f0: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71   nBase;.  }.  sq
4500: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4510: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4520: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
4530: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
4540: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66 28 20  CEL_DUP);.  if( 
4550: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4570: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4580: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4590: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
45a0: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
45b0: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Reg==0 ){.    sq
45c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
45d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
45e0: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
45f0: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
4610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4620: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
4630: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
4640: 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72  nOBSat, regRecor
4650: 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74  d);.  if( nOBSat
4660: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
4670: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
4680: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
4690: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
46a0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
46b0: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
46c0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
46d0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
46e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
46f0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
4700: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4710: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
4720: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
4730: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
4740: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
4750: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
4760: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
4770: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4780: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
4790: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
47a0: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
47b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
47c0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
47d0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
47e0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
47f0: 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d      regPrevKey =
4800: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4810: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4820: 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  m += pSort->nOBS
4830: 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e  at;.    nKey = n
4840: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
4850: 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20  BSat + bSeq;.   
4860: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4870: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4890: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
48a0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20  gBase+nExpr); . 
48b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48c0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
48d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
48e0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
48f0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4900: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
4910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4930: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
4940: 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  re, regPrevKey, 
4950: 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e  regBase, pSort->
4960: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70  nOBSat);.    pOp
4970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4980: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
4990: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
49a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
49b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
49c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70   return;.    pOp
49d0: 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44  ->p2 = nKey + nD
49e0: 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70  ata;.    pKI = p
49f0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4a00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d  .    memset(pKI-
4a10: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  >aSortOrder, 0, 
4a20: 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a  pKI->nField); /*
4a30: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62   Makes OP_Jump b
4a40: 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f  elow testable */
4a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4a60: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4a70: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4a80: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4a90: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69  tcase( pKI->nXFi
4aa0: 65 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70  eld>2 );.    pOp
4ab0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  ->p4.pKeyInfo = 
4ac0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4ad0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4ae0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42  t->pOrderBy, nOB
4af0: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b  pKI->nXField-1);
4b30: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
4b40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4b50: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
4b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b70: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
4b80: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
4b90: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
4ba0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
4bb0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
4bc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4bd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
4be0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
4bf0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
4c20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
4c30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
4c40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
4c50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c60: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
4c70: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4c80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4ca0: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
4cb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4cc0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
4cd0: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
4ce0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4d00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4d10: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4d20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4d30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4d40: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4d50: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4d60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4d70: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4d80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4d90: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4da0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4db0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
4dc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
4dd0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
4de0: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
4df0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
4e00: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
4e10: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
4e20: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4e30: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
4e40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
4e50: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
4e60: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
4e70: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
4e80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4e90: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
4ea0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
4ed0: 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31  dImm, iLimit, -1
4ee0: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
4ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
4f00: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
4f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4f20: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
4f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
4f50: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
4f60: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
4f70: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4f80: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
4f90: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
4fa0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
4fb0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
4fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
4fd0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
4fe0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
4ff0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
5000: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
5010: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
5020: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5030: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
5040: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
5050: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5060: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
5070: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5080: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
5090: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
50a0: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
50b0: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
50c0: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
50d0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
50e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
50f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5100: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20  IfNeg, iOffset, 
5110: 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65  0, -1); VdbeCove
5120: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5140: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
5150: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
5160: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
5170: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
5180: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
5190: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
51a0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
51b0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
51c0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
51d0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
51e0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
51f0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
5200: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
5210: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
5220: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
5230: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
5240: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
5250: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
5260: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
5270: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
5280: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
5290: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
52a0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
52b0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
52c0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
52d0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
52e0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
52f0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
5300: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
5310: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
5320: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
5330: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
5340: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
5350: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
5360: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5370: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5380: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
5390: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
53a0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
53b0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
53c0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
53d0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
53e0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
53f0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
5400: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
5410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5420: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
5430: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
5440: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5450: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
5460: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5470: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
5480: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
5490: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
54a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
54b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
54c0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
54d0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
54e0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
54f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
5500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5510: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5520: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
5530: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5540: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5550: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
5560: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
5570: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5580: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
5590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
55a0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
55b0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
55c0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
55d0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
55e0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
55f0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
5600: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
5610: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
5620: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
5630: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
5640: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
5650: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
5660: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
5670: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
5680: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
5690: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
56a0: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
56b0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
56c0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
56d0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
56e0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
56f0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
5700: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
5710: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
5720: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
5730: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5740: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
5750: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
5760: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5770: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
5780: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
5790: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
57a0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
57b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
57c0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
57d0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
57e0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
57f0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
5800: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
5810: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
5820: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5830: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
5840: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5850: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
5860: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
5870: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
5880: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
5890: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
58a0: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
58b0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
58c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
58d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
58e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
58f0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5900: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
5910: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
5920: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
5930: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
5940: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
5950: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
5960: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
5970: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
5980: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5990: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
59a0: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
59b0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
59c0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
59d0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
59e0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
59f0: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
5a00: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
5a10: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
5a20: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
5a30: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
5a40: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
5a50: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
5a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5a70: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
5a80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5a90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
5aa0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5ab0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
5ac0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
5ad0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5ae0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
5af0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
5b00: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
5b10: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b30: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
5b40: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
5b50: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
5b60: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
5b70: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
5b80: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52  ow to process OR
5b90: 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74  DER BY */.  Dist
5ba0: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
5bb0: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
5bc0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5bd0: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
5be0: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
5bf0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
5c00: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5c10: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
5c20: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
5c30: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
5c40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
5c50: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
5c60: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
5c70: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
5c80: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5c90: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
5ca0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
5cb0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5cc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5cd0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
5ce0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
5cf0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5d00: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5d10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
5d20: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
5d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5d40: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
5d50: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
5d60: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
5d70: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5d80: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
5d90: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
5da0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
5db0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
5dc0: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
5dd0: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
5de0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
5df0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5e10: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5e20: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
5e30: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
5e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5e50: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
5e60: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
5e70: 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sult */..  asser
5e80: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
5e90: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
5ea0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
5eb0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
5ec0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
5ed0: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
5ee0: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
5ef0: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
5f00: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
5f10: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
5f20: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
5f30: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
5f40: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
5f50: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
5f60: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
5f70: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
5f80: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
5f90: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
5fa0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
5fb0: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
5fc0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
5fd0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
5fe0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
5ff0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
6000: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
6010: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
6020: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6030: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6040: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6050: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6060: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6070: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6090: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
60a0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
60b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
60c0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
60d0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
60e0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
60f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
6100: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
6110: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
6120: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6130: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6140: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6150: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6160: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6170: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6180: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6190: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
61a0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
61b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
61c0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
61d0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
61e0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
61f0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
6200: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
6210: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
6220: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6230: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6240: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6250: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6260: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6270: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6280: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6290: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
62a0: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
62b0: 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20  ol;.  regResult 
62c0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
62d0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
62e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
62f0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
6300: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6310: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6320: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6330: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6340: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6350: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6360: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6370: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
6380: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
6390: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
63a0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
63b0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
63c0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
63d0: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
63e0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
63f0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
6400: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
6410: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6430: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6440: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
6450: 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt,.            
6460: 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52        (eDest==SR
6470: 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d  T_Output||eDest=
6480: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f  =SRT_Coroutine)?
6490: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a  SQLITE_ECEL_DUP:
64a0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  0);.  }..  /* If
64b0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
64c0: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
64d0: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
64e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
64f0: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
6500: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
6510: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
6520: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
6530: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
6540: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
6550: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
6560: 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74     switch( pDist
6570: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
6580: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
6590: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
65a0: 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
65b0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f          /* No lo
65d0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70  nger required Op
65e0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
65f0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  r. */.        in
6600: 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20  t iJump;        
6610: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
6620: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  stination */.   
6630: 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76       int regPrev
6640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6650: 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e  Previous row con
6660: 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tent */..       
6670: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
6680: 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ce for the previ
6690: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ous row */.     
66a0: 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
66b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
66c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
66d0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
66e0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ..        /* Cha
66f0: 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
6700: 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65  phemeral coded e
6710: 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f  arlier to an OP_
6720: 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  Null.        ** 
6730: 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65  sets the MEM_Cle
6740: 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20  ared bit on the 
6750: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f  first register o
6760: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
6770: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
6780: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
6790: 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f  e the OP_Ne belo
67a0: 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20  w to always.    
67b0: 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74      ** fail on t
67c0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
67d0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65  on of the loop e
67e0: 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ven if the first
67f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  .        ** row 
6800: 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20  is all NULLs..  
6810: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6820: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6830: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73  geToNoop(v, pDis
6840: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
6850: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20  ;.        pOp = 
6860: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6870: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6880: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6890: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
68a0: 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  OP_Null;.       
68b0: 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20   pOp->p1 = 1;.  
68c0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
68d0: 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  regPrev;..      
68e0: 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65    iJump = sqlite
68f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6900: 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c  (v) + nResultCol
6910: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6920: 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b  0; i<nResultCol;
6930: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
6940: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
6950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6960: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
6970: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6990: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29  i<nResultCol-1 )
69a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
69b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
69c0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
69d0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
69e0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
69f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
6a00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
6a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
6a40: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
6a50: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
6a60: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
6a70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6a80: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
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 34 28 76 2c 20 2d  dbeChangeP4(v, -
6ab0: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
6ac0: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
6ad0: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
6ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6af0: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
6b00: 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEQ);.        }.
6b10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6b20: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6b30: 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
6b40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
6b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6b60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
6b90: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
6ba0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6bc0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6bd0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
6be0: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
6bf0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6c00: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
6c10: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
6c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
6c40: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
6c50: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
6c60: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
6c70: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
6c80: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
6c90: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
6ca0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
6cb0: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
6cc0: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
6cd0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
6ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6d00: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
6d10: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
6d20: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
6d30: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
6d40: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
6d50: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
6d60: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
6d70: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
6d80: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
6d90: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
6da0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
6db0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
6dc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6dd0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
6de0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
6df0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
6e00: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
6e10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6e20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e40: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
6e50: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
6e60: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
6e70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6e80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6e90: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
6ea0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6eb0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6ec0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
6ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ee0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
6ef0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
6f00: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
6f10: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
6f20: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
6f30: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
6f40: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
6f50: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
6f60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
6f70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
6f80: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
6f90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
6fa0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
6fb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6fc0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
6fd0: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
6fe0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
6ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7000: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7010: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7020: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
7030: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
7040: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
7050: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
7060: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7070: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
7080: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
7090: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
70a0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
70b0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
70c0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
70d0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
70e0: 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65  Parse, nPrefixRe
70f0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  g+1);.      test
7100: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7110: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7120: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7130: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7150: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7160: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7170: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7180: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29  , r1+nPrefixReg)
7190: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
71a0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20  _OMIT_CTE.      
71b0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
71c0: 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20  istFifo ){.     
71d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
71e0: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
71f0: 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f  Fifo, then curso
7200: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
7210: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
7220: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
7230: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
7240: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
7250: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
7260: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7270: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
7280: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
7290: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
72a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
72b0: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
72c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
72d0: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
72e0: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
72f0: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
7300: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
7310: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
7320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7330: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
7340: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7350: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7360: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
7370: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
7380: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7390: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
73a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
73b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
73c0: 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20  Parm+1, r1);.   
73d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
73e0: 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  rt==0 );.      }
73f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
7400: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7410: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
7420: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
7430: 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65   p, r1+nPrefixRe
7440: 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  g, 1, nPrefixReg
7450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7460: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7470: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7480: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
74a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
74b0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
74c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
74e0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
74f0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
7500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7510: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7520: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
7530: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7540: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7550: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7560: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7570: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7580: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7590: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
75a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
75b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
75c0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
75d0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
75e0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
75f0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
7600: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
7610: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
7620: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
7630: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7640: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7650: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7660: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7670: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7680: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7690: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
76a0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
76b0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
76c0: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
76d0: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
76f0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
7700: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
7710: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
7720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7730: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7740: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7750: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7760: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7770: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7780: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7790: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
77a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
77b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
77c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
77d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
77e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
77f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7800: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7810: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7820: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7830: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7840: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7850: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7860: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7870: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7880: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7890: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
78a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
78b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
78d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
78e0: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
78f0: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
7900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7910: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7920: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7930: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
7940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7950: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7960: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7970: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
7980: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7990: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
79a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
79b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
79c0: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
79d0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
79e0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
79f0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
7a00: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
7a10: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
7a20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7a30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a40: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
7a50: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
7a60: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7a70: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7a80: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7aa0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7ab0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
7ac0: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
7ad0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
7ae0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
7af0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
7b00: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
7b10: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
7b20: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
7b30: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
7b40: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
7b50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7b60: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7b70: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7b80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7b90: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7ba0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7bb0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7bc0: 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72  egResult, 1, nPr
7bd0: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
7be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7bf0: 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74  ssert( regResult
7c00: 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20  ==iParm );.     
7c10: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
7c20: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
7c30: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
7c40: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7c50: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7c60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c80: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
7c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
7ca0: 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f  routine:       /
7cb0: 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61  * Send data to a
7cc0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
7cd0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
7ce0: 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ut: {        /* 
7cf0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
7d00: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
7d10: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7d20: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
7d30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7d40: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7d60: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7d70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7d80: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7d90: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7da0: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
7db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7dc0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  f( eDest==SRT_Co
7dd0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
7de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7df0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
7e00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
7e10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7e40: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
7e50: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7e70: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7e80: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7e90: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7ea0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
7eb0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7ec0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7ed0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7ee0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
7ef0: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
7f00: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
7f10: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
7f20: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
7f30: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
7f40: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
7f50: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
7f60: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
7f70: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
7f80: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
7f90: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
7fa0: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
7fb0: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
7fc0: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
7fd0: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
7fe0: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
7ff0: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
8000: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
8010: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
8020: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
8030: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
8040: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
8050: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
8060: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
8070: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
8080: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
8090: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
80a0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
80b0: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
80c0: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
80d0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
80e0: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
80f0: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
8100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
8110: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
8120: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
8130: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
8140: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
8150: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
8160: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
8170: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
8180: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
8190: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
81a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
81b0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
81c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
81d0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
81e0: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
81f0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
8200: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
8210: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
8220: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
8230: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
8240: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
8250: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
8260: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
8270: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
8280: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
8290: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
82a0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
82b0: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +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: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
82f0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8300: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8330: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8340: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8350: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
8360: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8370: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8390: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
83a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83b0: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
83c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
83d0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
83e0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
83f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
8400: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
8410: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8430: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , 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 72 65 67 52 65 73 75 6c 74 20        regResult 
8460: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
8470: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
8480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8490: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
84a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
84b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84c0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
84d0: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
84e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8500: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
8510: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
8520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8540: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  );.      if( add
8560: 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56  rTest ) sqlite3V
8570: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8580: 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20  ddrTest);.      
8590: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
85a0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
85b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
85c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
85d0: 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65  (pParse, r2, nKe
85e0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  y+2);.      brea
85f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
8600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
8610: 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  TE */....#if !de
8620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8630: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
8640: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
8650: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
8660: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
8670: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
8680: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
8690: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
86a0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
86b0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
86c0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
86d0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
86e0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
86f0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
8700: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
8710: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
8720: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
8730: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
8740: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
8750: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
8760: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
8770: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
8780: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
87a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
87b0: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
87c0: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
87d0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
87e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
87f0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
8800: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
8810: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
8820: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
8830: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
8840: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
8850: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
8860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8870: 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
8880: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8890: 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76  ak, -1); VdbeCov
88a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
88b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
88c0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
88d0: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
88e0: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
88f0: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
8900: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
8910: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
8920: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
8930: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
8940: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
8950: 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c  KeyInfo *p = sql
8960: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8970: 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (0, .           
8980: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b          sizeof(K
8990: 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a  eyInfo) + (N+X)*
89a0: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
89b0: 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29  )+1));.  if( p )
89c0: 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  {.    p->aSortOr
89d0: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  der = (u8*)&p->a
89e0: 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70  Coll[N+X];.    p
89f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
8a00: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c  N;.    p->nXFiel
8a10: 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20  d = (u16)X;.    
8a20: 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
8a30: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  ;.    p->db = db
8a40: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
8a50: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8a60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8a70: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
8a80: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
8a90: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
8aa0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
8ab0: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
8ac0: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
8ad0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8ae0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
8af0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
8b00: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8b10: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
8b20: 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b  te3DbFree(0, p);
8b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
8b40: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
8b50: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
8b60: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
8b70: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
8b80: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8b90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8ba0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8bb0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
8bc0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8bd0: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
8be0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
8bf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
8c00: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8c10: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
8c20: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
8c30: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
8c40: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
8c50: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
8c60: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
8c70: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
8c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8c90: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
8ca0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
8cb0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
8cc0: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
8cd0: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
8ce0: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
8cf0: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
8d00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
8d10: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
8d20: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
8d30: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
8d40: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
8d50: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
8d60: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
8d70: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
8d80: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8d90: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
8da0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8db0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8dc0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
8dd0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8de0: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
8df0: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
8e00: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
8e10: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
8e20: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
8e30: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
8e40: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
8e50: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
8e60: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
8e70: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
8e80: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
8e90: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
8ea0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
8eb0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
8ec0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
8ed0: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
8ee0: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
8ef0: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
8f00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
8f10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
8f20: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8f30: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
8f40: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
8f50: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
8f60: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
8f70: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
8f80: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
8f90: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
8fa0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
8fb0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
8fc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8fd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8fe0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8ff0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9000: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9010: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9020: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9030: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
9040: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
9050: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
9060: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
9070: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
9080: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9090: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
90a0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
90b0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
90c0: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
90d0: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
90e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
90f0: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9100: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9110: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9120: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9130: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
9140: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9150: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
9160: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
9170: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
9180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9190: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
91a0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
91b0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
91c0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
91d0: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
91e0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
91f0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9200: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9210: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9220: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9230: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9240: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9250: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9260: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
9270: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9280: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9290: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
92a0: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
92b0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
92c0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
92d0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
92e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
92f0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9300: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
9310: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9320: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9330: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9340: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9350: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9360: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9370: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9380: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9390: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
93a0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
93b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
93c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
93d0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
93e0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
93f0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9400: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9410: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9420: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9430: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9440: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9460: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9470: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9480: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
9490: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
94a0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
94b0: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
94c0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
94d0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
94e0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
94f0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9500: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9510: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9520: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9530: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9540: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9550: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
9560: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
9570: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9580: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
9590: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
95a0: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
95b0: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
95c0: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
95d0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
95e0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
95f0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
9600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9610: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
9640: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
9650: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
9660: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
9670: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
9680: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
9690: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
96a0: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
96b0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
96c0: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
96d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
96e0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
96f0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
9700: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
9710: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
9720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
9730: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
9740: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
9750: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
9760: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
9770: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
9780: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
9790: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
97a0: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
97b0: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
97c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
97d0: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
97e0: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
97f0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
9800: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
9810: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
9820: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
9830: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
9840: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
9850: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
9860: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
9870: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9880: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
9890: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
98a0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
98b0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
98c0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
98d0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
98e0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
98f0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
9900: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
9910: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
9920: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
9930: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9940: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
9950: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9960: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9970: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
9980: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
9990: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
99a0: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
99b0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
99c0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
99d0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
99e0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
99f0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
9a00: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
9a10: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
9a20: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
9a30: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
9a40: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
9a50: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
9a60: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
9a70: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
9a80: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
9a90: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
9aa0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
9ab0: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
9ac0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9ad0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
9ae0: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
9af0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
9b00: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
9b10: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
9b20: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
9b30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
9b40: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
9b50: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
9b60: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
9b70: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
9b80: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
9b90: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
9ba0: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
9bb0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
9bc0: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
9bd0: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
9be0: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
9bf0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
9c00: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
9c10: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
9c20: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
9c30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c50: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
9c60: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
9c90: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9ca0: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
9cb0: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9cd0: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
9ce0: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9d10: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
9d20: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
9d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9d40: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
9d50: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
9d60: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
9d70: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
9d80: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
9d90: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
9da0: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
9db0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
9dc0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
9dd0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
9de0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
9df0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
9e00: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
9e10: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
9e20: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
9e30: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
9e40: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
9e50: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
9e60: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
9e70: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
9e80: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
9e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ea0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
9eb0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
9ec0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
9ed0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
9ee0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
9ef0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
9f00: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
9f10: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
9f20: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
9f30: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
9f40: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
9f50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
9f60: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
9f70: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
9f80: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
9f90: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
9fa0: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
9fb0: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
9fc0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
9fd0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
9fe0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
9ff0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
a000: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
a010: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
a020: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
a030: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
a040: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
a050: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
a060: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
a070: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
a080: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
a090: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
a0a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a0b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
a0c0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
a0d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a0e0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
a0f0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
a100: 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
a110: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a120: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
a130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a140: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
a150: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
a160: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
a170: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
a180: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
a190: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a1a0: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a1c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a1d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  nt */.  int addr
a1e0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
a1f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
a200: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a210: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
a220: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
a230: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
a240: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
a250: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
a260: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
a270: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
a280: 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a  t addrOnce = 0;.
a290: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78    int iTab;.  Ex
a2a0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
a2b0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
a2c0: 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  By;.  int eDest 
a2d0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
a2e0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
a2f0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20  est->iSDParm;.  
a300: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
a310: 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e  t regRowid;.  in
a320: 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53  t nKey;.  int iS
a330: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
a340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
a350: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
a360: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
a370: 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20   nSortData;     
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a390: 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20  Trailing values 
a3a0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72  to read from sor
a3b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ter */.  int i;.
a3c0: 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20    int bSeq;     
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72    /* True if sor
a3f0: 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75  ter record inclu
a400: 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a  des seq. no. */.
a410: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a420: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
a430: 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45  MENTS.  struct E
a440: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
a450: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
a460: 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ->a;.#endif..  i
a470: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a480: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
a490: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a4a0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
a4b0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
a4c0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
a4d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a4e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
a4f0: 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61 6b 29  o, 0, addrBreak)
a500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a510: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a520: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a530: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a540: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a550: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a560: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a570: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a580: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a590: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a5a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a5b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a5c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a5d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a5e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a5f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a600: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a610: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a620: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a630: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a640: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a650: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a660: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a670: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a680: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a690: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a6a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a6b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a6c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a6d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a6e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a6f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a700: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a710: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a720: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a730: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a750: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
a760: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
a770: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
a780: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
a790: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
a7a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a7b0: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
a7c0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a7e0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
a7f0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a800: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
a810: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a820: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a830: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a840: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
a850: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a860: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
a870: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
a880: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
a890: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
a8a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
a8d0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a8e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a8f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
a900: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
a910: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
a920: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
a930: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
a940: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
a950: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
a960: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
a970: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a980: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
a990: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
a9a0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
a9b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
a9c0: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
a9d0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
a9e0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
a9f0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
aa00: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
aa10: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
aa20: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
aa30: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
aa40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
aa50: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
aa60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
aa70: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
aa80: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
aa90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aaa0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
aab0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
aac0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
aad0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
aae0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
aaf0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
ab00: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
ab10: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
ab20: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
ab30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ab40: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ab50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ab60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
ab70: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
ab80: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ab90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aba0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
abb0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
abc0: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a  w, 1, regRowid,.
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e          &pDest->
abf0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
ac00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ac10: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ac20: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
ac30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
ac40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ac50: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
ac60: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
ac70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ac80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
ac90: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
aca0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
acb0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
acc0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
acd0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50  arse, regRow, iP
ace0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
acf0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
ad00: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
ad10: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
ad20: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
ad30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ad40: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
ad50: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
ad60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
ad70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
ad80: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
ad90: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
ada0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
adb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
adc0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
add0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
ade0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
adf0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
ae00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ae10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
ae20: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
ae30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
ae40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ae50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
ae60: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
ae70: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
ae80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aea0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
aeb0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
aec0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
aed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
aee0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
aef0: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
af00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
af10: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
af20: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
af30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
af40: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
af50: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
af60: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
af70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
af80: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
af90: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
afa0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
afb0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
afc0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
afd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afe0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
aff0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
b000: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b010: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
b020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b030: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
b040: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
b050: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
b060: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
b070: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
b080: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b090: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
b0a0: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
b0b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b0c0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
b0d0: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
b0e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b0f0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
b100: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
b110: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
b120: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
b130: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
b140: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
b150: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
b160: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b170: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
b180: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
b190: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
b1a0: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
b1b0: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
b1c0: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
b1d0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
b1e0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
b1f0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
b200: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
b210: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
b220: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
b230: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b240: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
b250: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b260: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
b270: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
b280: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
b290: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
b2a0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
b2b0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
b2c0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
b2d0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
b2e0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
b2f0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
b300: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
b310: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
b320: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
b330: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b340: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
b350: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
b360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
b370: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
b380: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
b390: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
b3a0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b3b0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b3c0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
b3d0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
b3e0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
b3f0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
b400: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
b410: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b420: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
b430: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
b440: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
b450: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b460: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
b470: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
b480: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
b490: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
b4a0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
b4b0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
b4c0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
b4d0: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
b4e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b4f0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b500: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
b510: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
b520: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
b530: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Impl(A,B,C,D,E,F
b540: 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ).static const c
b550: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
b560: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
b570: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
b580: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
b590: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
b5a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b5b0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
b5c0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b5d0: 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74  gCol,.  u8 *pEst
b5e0: 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20  Width.){.  char 
b5f0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
b600: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
b610: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
b620: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b630: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73  rigCol = 0;.#els
b640: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
b650: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
b660: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
b670: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
b680: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
b690: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
b6a0: 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63  pl(A,B,F).static
b6b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
b6c0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
b6d0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
b6e0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
b6f0: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
b700: 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .){.#endif /* !d
b710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
b720: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b730: 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20  DATA) */.  char 
b740: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
b750: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20  ;.  int j;.  u8 
b760: 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20  estWidth = 1;.. 
b770: 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
b780: 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  ==0) || pNC->pSr
b790: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
b7a0: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
b7b0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b7c0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
b7d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
b7e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
b7f0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
b800: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
b810: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
b820: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
b830: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
b840: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
b850: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
b860: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
b870: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
b880: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
b890: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
b8a0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
b8b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b8c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
b8d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b8e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
b8f0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
b900: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
b910: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b920: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
b930: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
b940: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
b950: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
b960: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
b970: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
b980: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
b990: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
b9a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
b9b0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
b9c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b9d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
b9e0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
b9f0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
ba00: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
ba10: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
ba20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
ba30: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
ba40: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
ba50: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
ba60: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
ba70: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
ba80: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
ba90: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
baa0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bab0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bac0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
bad0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
bae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
baf0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
bb00: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
bb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
bb20: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
bb30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bb40: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
bb50: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
bb60: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
bb70: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
bb80: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
bb90: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
bba0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
bbb0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
bbc0: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
bbd0: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
bbe0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
bbf0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
bc00: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
bc10: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
bc20: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
bc30: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
bc40: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
bc50: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
bc60: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
bc70: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
bc80: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
bc90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bca0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
bcb0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
bcc0: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
bcd0: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
bce0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bcf0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
bd00: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bd10: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bd20: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
bd30: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bd40: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
bd50: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
bd60: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
bd70: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
bd80: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
bd90: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
bda0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
bdb0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bdc0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
bdd0: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
bde0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
bdf0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
be00: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
be10: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
be20: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
be30: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
be40: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
be50: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
be60: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
be70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
be80: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
be90: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
bea0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
beb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bec0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
bed0: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
bee0: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
bef0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
bf00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
bf10: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
bf20: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
bf30: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
bf40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
bf50: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
bf60: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
bf70: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
bf80: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
bf90: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
bfa0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
bfb0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
bfc0: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
bfd0: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
bfe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
bff0: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
c000: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
c010: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c020: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
c030: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c040: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
c050: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
c060: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
c070: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
c080: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
c090: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
c0a0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
c0b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
c0c0: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
c0d0: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
c0e0: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
c0f0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c100: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
c110: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
c120: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
c130: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
c140: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
c150: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
c160: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
c170: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
c180: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
c190: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
c1a0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
c1b0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c1c0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
c1d0: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
c1e0: 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74  ,&zOrigCol, &est
c1f0: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20  Width); .       
c200: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
c210: 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  f( pTab->pSchema
c220: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
c230: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
c240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
c250: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
c260: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
c270: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
c280: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c290: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
c2a0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
c2b0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65  ->nCol) );.#ifde
c2c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c2d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c2e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c2f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
c300: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
c310: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
c320: 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  igCol = "rowid";
c330: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c340: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c350: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c360: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
c370: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
c380: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c390: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
c3a0: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
c3b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
c3c0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
c3d0: 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d        zOrigTab =
c3e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
c3f0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
c400: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
c410: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
c420: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
c430: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
c440: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
c450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
c460: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
c470: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
c480: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
c490: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  }.#else.        
c4a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
c4b0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c4c0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
c4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c4e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
c4f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
c500: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  pe;.          es
c510: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
c520: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
c530: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
c540: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
c550: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
c560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c570: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
c580: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
c590: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c5a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
c5b0: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
c5c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c5d0: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
c5e0: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
c5f0: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
c600: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
c610: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
c620: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
c630: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
c640: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
c650: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
c660: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
c670: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
c680: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c690: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c6a0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
c6b0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
c6c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
c6d0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
c6e0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
c6f0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
c700: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
c710: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
c720: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
c730: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
c740: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
c750: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
c760: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
c770: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
c780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c790: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
c7a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c7b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c7c0: 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72  ATA  .  if( pzOr
c7d0: 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  igDb ){.    asse
c7e0: 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26  rt( pzOrigTab &&
c7f0: 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20   pzOrigCol );.  
c800: 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f    *pzOrigDb = zO
c810: 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  rigDb;.    *pzOr
c820: 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62  igTab = zOrigTab
c830: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c  ;.    *pzOrigCol
c840: 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d   = zOrigCol;.  }
c850: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
c860: 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57  stWidth ) *pEstW
c870: 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b  idth = estWidth;
c880: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
c890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c8a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
c8b0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
c8c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c8d0: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
c8e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
c8f0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
c900: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
c910: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
c920: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c930: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
c940: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
c950: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
c960: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
c970: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c980: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
c990: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
c9a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c9b0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
c9c0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
c9d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c9e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
c9f0: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
ca00: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
ca10: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
ca20: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
ca30: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
ca40: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
ca50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ca60: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
ca70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
ca80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ca90: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
caa0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
cab0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
cac0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
cad0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
cae0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
caf0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
cb00: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
cb10: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
cb20: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
cb30: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
cb40: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
cb50: 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  l, 0);..    /* T
cb60: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
cb70: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
cb80: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
cb90: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
cba0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
cbb0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
cbc0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
cbd0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
cbe0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
cbf0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
cc00: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
cc10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cc20: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cc30: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
cc40: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
cc50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
cc60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
cc70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
cc80: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
cc90: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
cca0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ccb0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ccc0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ccd0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
cce0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
ccf0: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
cd00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cd10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
cd20: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
cd30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cd40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cd50: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
cd60: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
cd70: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
cd80: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
cd90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
cda0: 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f  ECLTYPE) */.}../
cdb0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
cdc0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
cdd0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
cde0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
cdf0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
ce00: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
ce10: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
ce20: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
ce30: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
ce40: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
ce50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ce60: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
ce70: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
ce80: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
ce90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
cea0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
ceb0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
cec0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
ced0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
cee0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
cef0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
cf00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
cf10: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
cf20: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
cf30: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
cf40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
cf50: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
cf60: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
cf70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cf80: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
cf90: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
cfa0: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
cfb0: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
cfc0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
cfd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
cfe0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
cff0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
d000: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
d010: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
d020: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
d030: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
d040: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
d050: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
d060: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
d070: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
d080: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
d090: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d0a0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
d0b0: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
d0c0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
d0d0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
d0e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d0f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
d100: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
d110: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
d120: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d130: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
d140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d150: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
d160: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
d170: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
d180: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d190: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d1a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d1b0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d1c0: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
d1d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d1e0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f   }else if( (p->o
d1f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
d200: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  p->op==TK_AGG_CO
d210: 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73  LUMN) && pTabLis
d220: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
d230: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
d240: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
d250: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
d260: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
d270: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
d280: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
d290: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
d2a0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
d2b0: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
d2c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
d2e0: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
d2f0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
d300: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
d310: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
d320: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
d330: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
d340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
d350: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
d360: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
d370: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
d380: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
d390: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
d3a0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
d3b0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
d3c0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
d3d0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
d3e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
d3f0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
d400: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
d410: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d420: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d430: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
d440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
d450: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
d460: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
d470: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d490: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
d4a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
d4b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
d4c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
d4d0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
d4e0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
d4f0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
d500: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d510: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d520: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
d530: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d540: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d550: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d560: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d570: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d580: 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
d590: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
d5a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d5b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d5c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d5d0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d  zSpan;.      z =
d5e0: 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d   z==0 ? sqlite3M
d5f0: 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75  Printf(db, "colu
d600: 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71  mn%d", i+1) : sq
d610: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d620: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
d630: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d640: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d650: 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f  NAME, z, SQLITE_
d660: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
d670: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
d680: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
d690: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
d6a0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
d6b0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
d6c0: 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  n list (which is
d6d0: 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74   really the list
d6e0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
d6f0: 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ** that form the
d700: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
d710: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d720: 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f  t) compute appro
d730: 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  priate.** column
d740: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62   names for a tab
d750: 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f  le that would ho
d760: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
d770: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  n list..**.** Al
d780: 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77  l column names w
d790: 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a  ill be unique..*
d7a0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f  *.** Only the co
d7b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63  lumn names are c
d7c0: 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e  omputed.  Column
d7d0: 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a  .zType, Column.z
d7e0: 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68  Coll,.** and oth
d7f0: 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c  er fields of Col
d800: 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  umn are zeroed..
d810: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
d820: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d830: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
d840: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
d850: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72   occurs,.** stor
d860: 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c  e NULL in *paCol
d870: 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c   and 0 in *pnCol
d880: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d890: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
d8a0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f  tic int selectCo
d8b0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
d8c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
d8d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d8e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d8f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d900: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
d910: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
d920: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
d930: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
d940: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
d950: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
d960: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d970: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
d980: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
d990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d9a0: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
d9b0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
d9c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d9d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
d9e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d9f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
da00: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
da10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
da20: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
da30: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
da50: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
da60: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
da70: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
da80: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
da90: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
daa0: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
dab0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
dac0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
dad0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dae0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
daf0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
db00: 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20    Expr *p;      
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db20: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
db30: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
db40: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
db50: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
db60: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
db70: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
db80: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
db90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
dba0: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
dbb0: 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c  [] */..  if( pEL
dbc0: 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
dbd0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
dbe0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
dbf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
dc00: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
dc10: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
dc20: 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
dc30: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
dc40: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61   nCol = 0;.    a
dc50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  Col = 0;.  }.  *
dc60: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
dc70: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
dc80: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
dc90: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
dca0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
dcb0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
dcc0: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
dcd0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
dce0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
dcf0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
dd00: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
dd10: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  pr);.    if( (zN
dd20: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
dd30: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
dd40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
dd50: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
dd60: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
dd70: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
dd80: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
dd90: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
dda0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ddb0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
ddc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
ddd0: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
dde0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
ddf0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
de00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
de10: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
de20: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
de30: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
de40: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
de50: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
de60: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
de70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
de80: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
de90: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
dea0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
deb0: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
dec0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
ded0: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
dee0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
def0: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
df00: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
df10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
df20: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
df30: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
df40: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
df50: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
df60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
df70: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
df80: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
df90: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
dfa0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
dfb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
dfc0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
dfd0: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
dfe0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
dff0: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
e000: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
e010: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
e020: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
e030: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
e040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
e050: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e060: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
e070: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
e080: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e090: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
e0a0: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
e0b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
e0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
e0d0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
e0e0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
e0f0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
e100: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
e110: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
e120: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e130: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
e140: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
e150: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e170: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
e180: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
e190: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
e1a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e1b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
e1c0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
e1d0: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
e1e0: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
e1f0: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
e200: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
e210: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
e220: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
e230: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
e240: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e250: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
e260: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
e270: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
e280: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e290: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
e2a0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
e2b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
e2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
e2d0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
e2e0: 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26  k=nName-1; k>1 &
e2f0: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
e300: 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29  (zName[k]); k--)
e310: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  {}.        if( k
e320: 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d  >=0 && zName[k]=
e330: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
e340: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
e350: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
e360: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
e370: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e380: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
e390: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
e3a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e3b0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
e3c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
e3d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
e3e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
e3f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
e400: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e410: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
e420: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
e430: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e440: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
e450: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
e460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e470: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
e480: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
e490: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e4a0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
e4b0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
e4c0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
e4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e4e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e500: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
e510: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
e520: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
e530: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
e540: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
e550: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
e560: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
e570: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
e580: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
e590: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
e5a0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
e5b0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
e5c0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
e5d0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
e5e0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
e5f0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
e600: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
e610: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
e620: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
e630: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
e640: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
e650: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
e660: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
e670: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
e680: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
e690: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
e6a0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
e6b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e6c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e6d0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
e6e0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
e6f0: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
e700: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
e710: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
e720: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e730: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
e740: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
e750: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
e760: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
e770: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e780: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e790: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e7a0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e7b0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
e7c0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
e7d0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
e7e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e7f0: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
e800: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
e810: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
e820: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
e830: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
e840: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
e850: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e860: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
e870: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
e880: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e890: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
e8a0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
e8b0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
e8c0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
e8d0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
e8e0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
e8f0: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
e900: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
e910: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
e920: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
e930: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
e940: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
e950: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
e960: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
e970: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e980: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
e990: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
e9a0: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
e9b0: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e9c0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e9d0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e9e0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e9f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
ea00: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
ea10: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
ea20: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
ea30: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ea40: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ea50: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ea60: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
ea70: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
ea80: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ea90: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
eaa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
eab0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
eac0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
ead0: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
eae0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
eaf0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
eb00: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
eb10: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
eb20: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
eb30: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
eb40: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
eb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
eb60: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
eb70: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
eb80: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
eb90: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
eba0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ebb0: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
ebc0: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
ebd0: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
ebe0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
ebf0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
ec00: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
ec10: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
ec20: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
ec30: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
ec40: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
ec50: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
ec60: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
ec70: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
ec80: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
ec90: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
eca0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
ecb0: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
ecc0: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
ecd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ece0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
ecf0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
ed00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ed10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
ed20: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
ed30: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
ed40: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
ed50: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
ed60: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
ed70: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
ed80: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
ed90: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
eda0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
edb0: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
edc0: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
edd0: 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
ede0: 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
edf0: 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
ee00: 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f  6) );.  selectCo
ee10: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ee20: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
ee30: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
ee40: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
ee50: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
ee60: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
ee70: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
ee80: 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
ee90: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
eea0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
eeb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
eec0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
eed0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
eee0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
eef0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
ef00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
ef10: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
ef20: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
ef30: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
ef40: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
ef50: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
ef60: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
ef70: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
ef80: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
ef90: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
efa0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
efb0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
efc0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
efd0: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
efe0: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
eff0: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
f000: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
f010: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f020: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
f030: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69  AddOp0(v, OP_Ini
f040: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
f050: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
f060: 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
f070: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
f080: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
f090: 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
f0a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72     ){.      pPar
f0b0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
f0c0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  r = 1;.    }..  
f0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
f0f0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
f100: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
f110: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
f120: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
f130: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
f140: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
f150: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
f160: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
f170: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
f180: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
f190: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
f1a0: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
f1b0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
f1c0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
f1d0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
f1e0: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
f1f0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
f200: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
f210: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
f220: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
f230: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
f240: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
f250: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
f260: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
f270: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
f280: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
f290: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
f2a0: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
f2b0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
f2c0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
f2d0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
f2e0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f2f0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
f300: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
f310: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
f320: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f330: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
f340: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
f350: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
f360: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
f370: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
f380: 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
f390: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
f3a0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
f3b0: 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
f3c0: 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
f3d0: 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
f3e0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
f3f0: 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
f400: 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
f410: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
f420: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
f430: 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
f440: 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
f450: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
f460: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
f470: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
f480: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
f490: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
f4a0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
f4b0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
f4c0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
f4d0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
f4e0: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
f4f0: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
f500: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
f510: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
f520: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
f530: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
f540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f550: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
f560: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
f570: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
f580: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
f590: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
f5a0: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
f5b0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
f5c0: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
f5d0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
f5e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
f5f0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
f600: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
f610: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
f620: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
f630: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
f640: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
f650: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
f660: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
f670: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
f680: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
f690: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
f6a0: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
f6b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
f6c0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
f6d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f6e0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
f6f0: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
f700: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
f710: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f720: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
f730: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
f740: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f750: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
f760: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
f770: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f780: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
f790: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
f7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f7c0: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
f7d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f7e0: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f7f0: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
f800: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
f810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f820: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f830: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
f840: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
f850: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
f860: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
f870: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
f880: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
f890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f8b0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
f8c0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
f8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f8e0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
f8f0: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
f900: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f910: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f920: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f930: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
f940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f950: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
f960: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
f970: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
f990: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
f9a0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
f9b0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
f9c0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
f9d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
f9e0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
f9f0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
fa00: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
fa10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fa20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fa30: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
fa40: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
fa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fa60: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fa70: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fa80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fa90: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
faa0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
fab0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
fac0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fad0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
fae0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
faf0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fb00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fb20: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
fb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fb50: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
fb60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fb70: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
fb80: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
fb90: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
fba0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
fbb0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
fbc0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
fbd0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fbe0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
fbf0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
fc00: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
fc10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
fc30: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
fc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fc50: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
fc60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
fc70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc80: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
fc90: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
fca0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
fcb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fcc0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
fcd0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
fce0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
fcf0: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
fd00: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
fd10: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
fd20: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
fd30: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
fd40: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
fd50: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
fd60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fd70: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
fd80: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
fd90: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
fda0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
fdb0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
fdc0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
fdd0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
fde0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
fdf0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
fe00: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
fe10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
fe20: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
fe30: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
fe40: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
fe50: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
fe60: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
fe70: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
fe80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fe90: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
fea0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
feb0: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
fec0: 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69   && iCol<p->pELi
fed0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
fee0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
fef0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ff00: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
ff10: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
ff20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
ff30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
ff40: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
ff50: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
ff60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
ff70: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
ff80: 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
ff90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
ffa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
ffb0: 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
ffc0: 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
ffd0: 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
ffe0: 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
fff0: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10000 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10010 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10020 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10030 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10040 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10050 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10060 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10070 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10080 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10090 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
100a0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
100b0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
100c0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
100d0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
100e0 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
100f0 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10100 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10110 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10120 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10130 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10140 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10150 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10160 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10170 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10180 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10190 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
101a0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
101b0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
101c0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
101d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
101e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
101f0 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
10200 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
10210 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
10220 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
10230 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
10240 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
10250 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
10260 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
10270 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10280 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10290 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
102a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102b0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
102c0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
102d0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
102e0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
102f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10300 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
10310 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
10320 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
10330 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
10340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10350 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
10360 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
10370 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
10380 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
103a0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
103b0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
103c0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
103d0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
103e0 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
103f0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
10400 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10420 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
10430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10440 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
10450 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
10460 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
10470 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
10480 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
10490 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
104a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
104b0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
104c0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
104d0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
104e0 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
104f0 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10520 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
10530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10540 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
10560 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
10570 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
10580 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
10590 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
105a0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
105b0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
105c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
105d0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
105e0 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
105f0 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
10600 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  a[].isRecursive 
10610 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
10620 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
10630 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
10640 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
10650 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
10660 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
10670 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
10680 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
10690 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
106a0 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
106b0 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
106c0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
106d0 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
106e0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
106f0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
10700 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
10710 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
10720 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
10730 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
10740 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
10750 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
10760 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
10770 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
10780 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
10790 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
107a0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
107b0 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
107c0 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
107d0 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
107e0 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
107f0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
10800 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
10810 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
10820 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
10830 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
10840 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
10850 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
10860 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
10870 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
10880 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
10890 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
108a0 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
108b0 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
108c0 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
108d0 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
108e0 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
108f0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
10900 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
10910 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
10920 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
10930 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
10940 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
10950 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
10960 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
10970 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
10980 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10990 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
109a0 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
109b0 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
109c0 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
109d0 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
109e0 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
109f0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
10a00 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
10a10 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
10a20 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
10a30 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
10a40 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
10a50 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
10a60 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
10a70 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
10a80 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
10a90 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
10aa0 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
10ab0 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
10ac0 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
10ad0 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
10ae0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
10af0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
10b00 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
10b10 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
10b20 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
10b30 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
10b40 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
10b50 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
10b60 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
10b70 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
10b80 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
10b90 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
10ba0 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
10bb0 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
10bc0 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
10bd0 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
10be0 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
10bf0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10c00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10c10 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10c30 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
10c40 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
10c50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10c60 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
10c70 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
10c80 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
10c90 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
10ca0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
10cb0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
10cc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
10cd0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
10ce0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
10cf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
10d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10d10 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
10d20 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
10d30 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
10d40 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
10d50 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
10d60 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
10d70 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
10d80 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
10d90 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
10da0 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
10db0 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
10dc0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
10dd0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
10de0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
10df0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
10e00 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
10e10 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
10e20 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
10e30 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
10e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10e50 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
10e60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
10e70 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
10e80 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10e90 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
10ea0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
10eb0 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
10ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ed0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10ee0 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
10ef0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10f00 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
10f10 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
10f20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
10f30 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
10f40 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10f50 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
10f60 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
10f70 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
10f80 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
10f90 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
10fa0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10fb0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10fe0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
11010 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
11020 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
11030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
11040 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
11050 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
11060 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
11070 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
11080 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
11090 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
110a0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
110b0 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
110c0 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
110d0 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
110e0 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
110f0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
11100 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
11110 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11120 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11130 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
11140 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
11150 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
11160 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
11170 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
11180 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
11190 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
111a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
111b0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
111c0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
111d0 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
111e0 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
111f0 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
11200 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
11210 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
11220 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
11230 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
11240 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
11250 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
11260 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
11270 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
11280 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11290 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
112a0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
112b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
112c0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
112d0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
112e0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
112f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11300 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75  Src->a[i].isRecu
11310 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
11320 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
11330 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
11340 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
11360 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
11370 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
11380 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
11390 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
113a0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
113b0 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
113c0 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
113d0 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
113e0 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
113f0 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
11400 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
11410 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
11420 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
11430 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
11440 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
11450 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
11460 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
11470 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
11480 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
11490 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
114a0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
114b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
114c0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
114d0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
114e0 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
114f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
11500 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
11510 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
11520 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
11530 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
11540 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
11550 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
11560 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
11570 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11580 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11590 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
115a0 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
115b0 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
115c0 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
115d0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
115e0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
115f0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
11600 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
11610 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
11620 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11630 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11640 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
11650 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
11660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11670 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
11680 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
11690 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
116a0 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
116b0 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
116c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
116d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
116e0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
116f0 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
11700 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11710 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
11720 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
11730 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
11740 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
11750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11760 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11770 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
11780 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
11790 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
117a0 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
117b0 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
117c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
117d0 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
117e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
117f0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
11800 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11810 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
11820 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
11830 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
11840 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
11850 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11860 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
11870 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
11880 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
11890 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
118a0 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
118b0 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
118c0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
118d0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
118e0 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
118f0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
11900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11910 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11920 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
11930 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11940 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
11950 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
11960 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
11970 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
11980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11990 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
119a0 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
119b0 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
119c0 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
119d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
119e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
119f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
11a00 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11a10 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
11a20 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
11a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11a40 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
11a50 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
11a60 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
11a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11a80 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
11a90 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
11aa0 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
11ab0 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
11ac0 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
11ad0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11ae0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
11af0 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
11b00 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
11b10 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11b20 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11b30 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
11b40 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
11b50 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
11b60 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
11b70 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
11b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11b90 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72  (v, OP_IfZero, r
11ba0 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
11bb0 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62  ak, -1);.    Vdb
11bc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11bd0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
11be0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
11bf0 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
11c00 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
11c10 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
11c20 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
11c30 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
11c40 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
11c50 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
11c60 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
11c70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
11c80 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
11c90 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11ca0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11cb0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
11cc0 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ueue);.  assert(
11cd0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
11ce0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
11cf0 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Setup;..  /* Kee
11d00 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f  p running the lo
11d10 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  op until the Que
11d20 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ue is empty */. 
11d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11d50 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
11d60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11d70 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
11d80 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
11d90 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
11da0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11db0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
11dc0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
11dd0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11de0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
11df0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
11e00 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
11e10 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
11e20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11e30 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
11e40 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
11e50 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
11e60 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
11e70 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
11e80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11e90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11ea0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11eb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11ec0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
11ed0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
11ee0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
11ef0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
11f00 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
11f10 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
11f20 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
11f30 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
11f40 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20  for when two or 
11f50 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20  more terms of a 
11f60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
11f70 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
11f80 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65  * size result se
11f90 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
11fa0 69 64 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75  id selectWrongNu
11fb0 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73  mTermsError(Pars
11fc0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11fd0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
11fe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
11ff0 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lues ){.    sqli
12000 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12010 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
12020 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
12030 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
12040 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ms");.  }else{. 
12050 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12060 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
12070 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
12080 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
12090 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
120a0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
120b0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
120c0 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
120d0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
120e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64   }.}../*.** Hand
120f0 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12100 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12110 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12120 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12130 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12140 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12150 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12160 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12170 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12180 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12190 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
121a0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
121b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
121c0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
121d0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
121e0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
121f0 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12200 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12210 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12220 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12230 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12240 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12250 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12260 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12270 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12280 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12290 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
122a0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
122b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
122c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
122d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
122f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12300 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12310 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12320 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12330 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12340 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12350 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12360 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
12370 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
12380 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e  ->nExpr;.  int n
12390 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
123a0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
123b0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
123c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
123d0 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
123e0 6c 75 65 73 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  lues );.  do{.  
123f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
12400 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
12410 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
12420 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
12430 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | (p->op==TK_SEL
12440 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ECT && p->pPrior
12450 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
12460 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
12470 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12480 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
12490 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
124a0 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 45 78 70 72  st->nExpr!=nExpr
124b0 20 29 7b 0a 20 20 20 20 20 20 73 65 6c 65 63 74   ){.      select
124c0 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
124d0 6f 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  or(pParse, p);. 
124e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
124f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
12500 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
12510 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
12520 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
12530 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
12540 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
12550 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
12560 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
12570 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
12580 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
12590 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
125a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
125b0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
125c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
125d0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
125e0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
125f0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
12600 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
12610 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12640 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
12650 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
12660 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
12670 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
12680 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
12690 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
126a0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
126b0 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
126c0 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
126d0 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
126e0 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
126f0 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
12700 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
12710 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
12720 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
12730 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
12740 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
12750 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
12760 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
12770 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
12780 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
12790 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
127a0 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
127b0 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
127c0 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
127d0 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
127e0 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
127f0 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
12800 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
12810 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
12820 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
12830 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
12840 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
12850 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
12860 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
12870 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
12880 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
12890 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
128a0 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
128b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
128c0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
128d0 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
128e0 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
128f0 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
12910 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12920 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
12930 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
12940 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
12950 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
12960 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
12970 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
12980 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
12990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
129a0 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
129b0 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
129c0 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
129d0 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
129e0 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
129f0 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
12a00 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
12a10 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
12a20 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
12a30 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
12a40 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
12a50 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
12a60 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
12a70 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
12a80 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
12a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12aa0 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
12ab0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12ac0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12ad0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12ae0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12af0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12b00 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12b10 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12b20 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12b30 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12b40 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12b50 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
12b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12b70 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
12b80 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
12b90 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
12ba0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
12bb0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
12bc0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
12bd0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
12be0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12bf0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
12c00 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
12c10 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
12c20 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
12c30 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
12c40 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
12c50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
12c60 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
12c70 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
12c80 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
12c90 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
12ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12cb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12cc0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12cd0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
12ce0 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b    int iSub1 = 0;
12cf0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
12d00 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
12d10 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
12d20 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub2 = 0;        
12d30 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
12d40 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
12d50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
12d60 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
12d70 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
12d80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
12d90 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
12da0 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
12db0 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
12dc0 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
12dd0 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
12de0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
12df0 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
12e00 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
12e10 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
12e20 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
12e30 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
12e40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
12e50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
12e60 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
12e70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
12e80 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12e90 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
12ea0 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
12eb0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65   p->pPrior;.  de
12ec0 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
12ed0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
12ee0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
12ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12f00 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
12f10 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12f20 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12f30 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12f40 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12f50 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12f60 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12f70 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
12f80 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
12f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12fa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
12fb0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
12fc0 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12fd0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
12fe0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
12ff0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
13000 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
13010 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13020 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
13030 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13040 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13050 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
13060 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
13070 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
13080 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
13090 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
130a0 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
130b0 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
130c0 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
130d0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
130e0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
130f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13100 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
13110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13120 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13130 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
13140 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
13150 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13160 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
13170 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
13180 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
13190 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
131a0 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64   /* Special hand
131b0 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ling for a compo
131c0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
131d0 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20  originates as a 
131e0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20  VALUES clause.. 
131f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
13200 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
13210 6c 75 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d  lues ){.    rc =
13220 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13230 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13240 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13250 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13270 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13280 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13290 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
132a0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
132b0 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
132c0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
132d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
132e0 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
132f0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
13300 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
13310 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
13320 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
13330 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54   selectWrongNumT
13340 65 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65  ermsError(pParse
13350 2c 20 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  , p);.    rc = 1
13360 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13370 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13390 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
133a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
133b0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
133c0 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
133d0 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
133e0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
133f0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
13400 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
13410 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
13420 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13430 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
13440 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
13450 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
13460 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
13470 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
13480 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
13490 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
134a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
134b0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
134c0 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
134d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
134e0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
134f0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
13500 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
13510 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
13520 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
13530 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
13540 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
13550 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
13560 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
13570 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
13580 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
13590 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
135a0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
135b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
135c0 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
135d0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
135e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
135f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13600 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13620 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13630 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
13640 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
13650 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
13660 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13670 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13680 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
13690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
136a0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
136b0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
136c0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
136d0 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
136e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
136f0 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
13700 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
13710 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
13720 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13730 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
13740 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
13750 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13760 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
13770 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
13780 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
13790 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
137a0 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
137b0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
137c0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
137d0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
137e0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
137f0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
13800 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
13810 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
13820 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
13830 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
13840 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
13850 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
13860 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13870 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
13880 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
13890 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
138a0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
138b0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
138c0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
138d0 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
138e0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
138f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
13900 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
13910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
13920 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
13930 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
13940 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13960 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13970 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
13980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13990 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
139a0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
139b0 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
139c0 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
139d0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
139e0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
139f0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
13a00 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
13a10 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
13a20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
13a30 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
13a40 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
13a50 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
13a60 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
13a70 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
13a80 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
13a90 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
13aa0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
13ab0 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
13ac0 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
13ad0 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
13ae0 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
13af0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
13b00 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
13b10 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
13b20 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
13b30 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
13b40 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13b50 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
13b60 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
13b70 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
13b80 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
13b90 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
13ba0 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
13bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
13bc0 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
13bd0 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
13be0 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
13bf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13c10 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
13c20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
13c30 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
13c40 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13c50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
13c60 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
13c70 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
13c80 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
13c90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
13ca0 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
13cb0 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
13cc0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
13cd0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
13ce0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
13cf0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
13d00 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
13d10 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
13d20 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
13d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
13d40 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
13d50 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
13d60 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
13d70 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
13d80 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13d90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13da0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13db0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
13dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13dd0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13de0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
13df0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
13e00 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
13e10 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
13e20 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
13e30 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
13e40 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
13e50 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13e60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13e70 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
13e80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
13e90 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
13ea0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13eb0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
13ec0 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
13ed0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
13ee0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
13ef0 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
13f00 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
13f10 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
13f20 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
13f30 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
13f40 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13f50 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
13f60 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
13f70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
13f80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
13f90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13fa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13fb0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
13fc0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
13fd0 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
13fe0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
13ff0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
14000 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
14010 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14030 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14040 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
14050 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14060 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
14070 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14080 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14090 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
140a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
140b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
140c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
140d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
140e0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
140f0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
14100 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14110 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14120 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14140 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14150 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
14160 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14180 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
14190 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
141a0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
141b0 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
141c0 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
141d0 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
141e0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
141f0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
14200 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
14210 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14220 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
14230 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
14240 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
14250 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
14260 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
14270 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14280 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
14290 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
142a0 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
142b0 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
142c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
142d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
142e0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
142f0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14300 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14310 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14320 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
14330 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
14340 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
14350 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
14360 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
14370 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
14380 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
14390 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
143a0 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
143b0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
143c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
143d0 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
143e0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
143f0 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
14400 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
14410 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
14420 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14430 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
14440 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
14450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14460 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
14470 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14480 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
14490 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
144a0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
144b0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
144c0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
144d0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
144e0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
144f0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
14500 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
14510 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
14520 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
14530 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
14540 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14550 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
14560 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
14570 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14580 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
14590 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
145a0 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
145b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
145c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
145d0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
145e0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
145f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14600 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
14610 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14620 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14630 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
14640 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
14650 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
14660 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
14670 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
14680 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
14690 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
146a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
146b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
146c0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
146d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
146e0 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
146f0 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
14700 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14720 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14730 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14750 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14760 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
14770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14780 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14790 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
147a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
147b0 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
147c0 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
147d0 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
147e0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
147f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14800 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
14810 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14820 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
14830 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
14840 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
14850 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
14860 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
14870 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
14880 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
14890 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
148a0 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
148b0 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
148c0 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
148d0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
148e0 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
148f0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
14900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
14910 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
14920 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
14930 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14940 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
14950 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
14960 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
14970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14980 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14990 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
149a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149b0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
149c0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
149d0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
149e0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
149f0 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
14a00 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
14a10 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14a20 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
14a30 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
14a40 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14a50 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
14a60 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
14a70 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
14a80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14a90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14aa0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
14ab0 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
14ac0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
14ad0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14ae0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14af0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14b00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14b20 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
14b30 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14b40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14b50 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14b60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14b70 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b80 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14b90 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
14ba0 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
14bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
14bc0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14be0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
14bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
14c00 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
14c10 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
14c20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
14c30 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
14c40 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14c50 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
14c60 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14c70 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14c80 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14c90 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14ca0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14cb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
14cc0 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61  ersectdest.iSDPa
14cd0 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
14ce0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14cf0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14d00 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14d10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14d20 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14d30 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
14d40 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14d50 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14d60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14d70 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14d80 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14d90 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14da0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
14db0 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
14dc0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
14dd0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
14de0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
14df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
14e00 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14e10 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14e20 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14e30 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14e40 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20   = pOffset;..   
14e50 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
14e60 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
14e70 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
14e80 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
14e90 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
14ea0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14eb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14ec0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
14ed0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
14ee0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
14ef0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
14f00 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
14f10 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
14f20 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
14f30 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
14f40 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14f50 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14f60 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
14f70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
14f80 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
14f90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14fa0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
14fb0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
14fc0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14fd0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
14fe0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14ff0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
15000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15020 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
15030 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
15040 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  (v);.      r1 = 
15050 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15060 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15070 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
15080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15090 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
150a0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
150b0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
150c0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
150d0 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
150e0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
150f0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
15100 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15110 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15120 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15130 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15140 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
15150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15160 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
15170 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
15180 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15190 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
151a0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
151b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
151d0 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
151e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
151f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15200 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15210 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15230 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
15240 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
15250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15260 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15270 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
15280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15290 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
152a0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
152b0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
152c0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
152d0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
152e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
152f0 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
15300 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15310 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
15320 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
15330 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
15340 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
15350 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
15360 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
15370 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
15380 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
15390 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
153a0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
153b0 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
153c0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
153d0 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
153e0 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
153f0 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
15400 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
15410 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
15420 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
15430 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
15440 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
15450 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
15460 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
15470 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
15480 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
15490 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
154a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
154c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
154d0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
154e0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
154f0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
15500 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
15510 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
15520 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
15530 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15540 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15550 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
15560 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
15570 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
15580 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
15590 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
155a0 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
155b0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
155c0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
155f0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
15600 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
15610 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
15620 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
15630 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
15640 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
15650 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
15660 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  db, nCol, 1);.  
15670 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
15680 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15690 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
156a0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
156b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
156c0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
156d0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
156e0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
156f0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
15700 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
15710 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
15720 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
15730 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
15740 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
15750 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
15760 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
15770 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
15780 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
15790 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
157a0 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
157b0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
157c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
157d0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
157e0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
157f0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
15800 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
15810 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
15820 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
15830 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
15840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
15850 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
15860 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
15870 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
15880 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
15890 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
158a0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
158b0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
158c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
158d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
158e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
158f0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
15900 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
15910 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
15920 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
15930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15940 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
15970 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
15980 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15990 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
159a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
159b0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
159c0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
159d0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
159e0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
159f0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
15a00 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
15a10 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
15a20 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15a30 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
15a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15a60 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
15a70 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
15a80 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
15a90 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
15aa0 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
15ab0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
15ac0 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
15ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
15ae0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
15af0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
15b00 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
15b10 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
15b20 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
15b30 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
15b40 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
15b50 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
15b60 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
15b70 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
15b80 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
15b90 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
15ba0 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
15bb0 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
15bc0 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
15bd0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
15be0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
15bf0 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
15c00 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
15c10 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
15c20 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
15c30 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
15c40 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
15c50 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
15c60 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
15c70 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
15c80 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
15c90 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
15ca0 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
15cb0 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
15cc0 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
15cd0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
15ce0 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
15cf0 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
15d00 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
15d10 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
15d20 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
15d30 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
15d40 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
15d50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15d60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
15d70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15d80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15da0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15db0 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
15dc0 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
15dd0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
15de0 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
15df0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
15e00 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
15e10 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
15e20 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
15e30 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
15e40 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
15e50 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
15e60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
15e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15e80 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
15e90 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
15ea0 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
15eb0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15ec0 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
15ed0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
15ee0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
15ef0 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f10 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
15f20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
15f30 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
15f40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
15f50 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
15f60 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
15f70 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15f80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15f90 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
15fa0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15fb0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
15fc0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
15fd0 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
15fe0 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
15ff0 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
16000 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
16010 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31  t j1, j2;.    j1
16020 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16030 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
16040 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
16050 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16060 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16070 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
16080 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
16090 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
160a0 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
160d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
160e0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
160f0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
16100 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16110 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
16120 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
16130 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16140 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
16150 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
16160 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16170 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16180 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
16190 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
161a0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
161b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
161d0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
161e0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
161f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16200 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
16210 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
16220 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
16230 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
16240 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
16250 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
16260 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
16270 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
16280 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
16290 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
162a0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
162b0 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
162c0 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
162d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
162e0 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
162f0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
16300 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
16310 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16320 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16330 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
16340 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16350 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
16360 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
16370 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
16380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16390 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
163a0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
163b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
163d0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
163e0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
163f0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
16400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16410 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
16420 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
16430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16440 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16450 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
16460 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
16470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16480 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16490 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
164a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
164b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
164c0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
164d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
164e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
164f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16500 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16510 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16520 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
16530 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
16540 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
16550 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
16560 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
16570 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
16580 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
16590 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
165a0 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
165b0 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
165c0 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
165d0 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
165e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
165f0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
16600 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
16610 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
16620 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
16630 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20  st->affSdst = . 
16640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
16650 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
16660 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
16670 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
16680 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20  Sdst);.      r1 
16690 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
166a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
166b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
166d0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
166e0 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74  t, 1, r1, &pDest
166f0 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20  ->affSdst,1);.  
16700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16710 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16720 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
16730 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  iSdst, 1);.     
16740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16750 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
16760 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
16770 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
16780 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16790 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
167a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
167b0 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
167c0 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
167d0 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
167e0 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
167f0 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
16800 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
16810 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
16820 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
16830 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16840 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
16850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16860 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
16870 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61   1, pDest->iSDPa
16880 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
16890 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
168a0 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
168b0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
168c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
168d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
168e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
168f0 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
16900 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
16910 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
16920 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
16930 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
16940 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
16950 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
16960 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
16970 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
16980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16990 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
169a0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
169b0 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
169c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
169d0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
169e0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
169f0 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16a00 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16a10 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16a20 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16a30 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16a40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16a50 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16a70 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16a80 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16a90 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16aa0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16ab0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16ac0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16ad0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16ae0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16af0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16b00 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16b10 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16b20 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16b30 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16b40 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16b50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16b60 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16b70 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16b80 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16ba0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16bb0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16bc0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16bd0 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73  dst, pDest->nSds
16be0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16bf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16c00 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
16c10 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
16c20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16c30 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
16c40 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
16c50 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
16c60 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
16c70 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
16c80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16c90 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
16ca0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
16cb0 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
16cc0 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
16cd0 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
16ce0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
16cf0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
16d00 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
16d10 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
16d20 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
16d30 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
16d40 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
16d50 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
16d60 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
16d70 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
16d80 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
16d90 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
16da0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
16db0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
16dc0 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
16dd0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
16de0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
16df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16e00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
16e10 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
16e20 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16e40 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
16e50 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
16e60 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
16e70 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
16e80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
16e90 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
16ea0 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
16eb0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
16ec0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
16ed0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
16ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16ef0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
16f00 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
16f10 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62  iBreak, -1); Vdb
16f20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16f30 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
16f40 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
16f50 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
16f60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16f70 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
16f80 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
16f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16fa0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
16fb0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
16fc0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
16fd0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
16fe0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
16ff0 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17000 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17010 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17020 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17030 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17040 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17050 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17060 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17070 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17080 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
17090 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
170a0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
170b0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
170c0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
170d0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
170e0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
170f0 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17100 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17110 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17120 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17130 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17140 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17150 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17160 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17170 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17180 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
17190 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
171a0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
171b0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
171c0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
171d0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
171e0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
171f0 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17200 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17210 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17220 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17230 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17240 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17250 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17260 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17270 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17280 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17290 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
172a0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
172b0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
172c0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
172d0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
172e0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
172f0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17300 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17310 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17320 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17330 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17340 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17350 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17360 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17370 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17380 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17390 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
173a0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
173b0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
173c0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
173d0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
173e0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
173f0 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17400 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17410 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17420 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17430 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17440 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17450 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17460 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17470 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17480 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17490 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
174a0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
174b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
174c0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
174d0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
174e0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
174f0 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17500 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17510 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17520 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17530 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17540 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17550 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17560 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17590 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
175a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
175b0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
175c0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
175d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
175e0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
175f0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17600 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17610 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17620 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17630 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17640 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17650 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17660 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17670 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17680 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
17690 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
176a0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
176b0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
176c0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
176d0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
176e0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
176f0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17700 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17710 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17720 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17730 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17740 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17750 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17760 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17770 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17780 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17790 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
177a0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
177b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
177c0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
177d0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
177e0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
177f0 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17800 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17810 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17820 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17830 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17840 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17850 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17860 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17870 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17880 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17890 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
178a0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
178b0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
178c0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
178d0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
178e0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
178f0 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17900 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17910 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17920 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17930 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17940 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17950 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17960 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17970 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17980 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17990 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
179a0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
179b0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
179c0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
179d0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
179e0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
179f0 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17a00 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17a10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17a20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17a30 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17a40 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17a50 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17a60 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17a70 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17a80 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17a90 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17aa0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17ab0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17ac0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17ad0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17ae0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17af0 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17b00 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17b10 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17b20 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17b30 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17b40 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17b50 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17b60 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17b80 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17b90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17ba0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17bb0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17bc0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17bd0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17be0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17bf0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17c00 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17c10 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17c20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17c30 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17c40 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17c50 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17c60 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17c70 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17c80 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17c90 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17ca0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17cb0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17cc0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17cd0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17ce0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
17cf0 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
17d00 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
17d10 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
17d20 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
17d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17d40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
17d50 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
17d60 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17d70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17d80 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17d90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17da0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17dc0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
17dd0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
17de0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
17df0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
17e00 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
17e10 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
17e20 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
17e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17e40 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
17e50 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
17e60 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
17e70 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
17e80 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
17e90 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17eb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17ec0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
17ed0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
17ee0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17ef0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17f00 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
17f10 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
17f20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
17f30 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
17f40 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
17f50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17f60 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
17f70 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
17f80 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
17f90 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
17fa0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17fb0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
17fc0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17fd0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
17fe0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17ff0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18000 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18010 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18020 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18030 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18040 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18050 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18060 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18070 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18080 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18090 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
180a0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
180b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
180c0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
180d0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
180e0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
180f0 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18100 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18110 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18120 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18130 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18140 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18150 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18160 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18170 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18180 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18190 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
181a0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
181b0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
181c0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
181d0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
181e0 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
181f0 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18200 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18210 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18220 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18230 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18240 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18250 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18260 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18270 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18280 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
182a0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
182b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
182c0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
182d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
182e0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
182f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18300 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18310 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18320 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18330 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18340 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18350 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18360 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18370 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18380 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
18390 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
183a0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
183b0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
183c0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
183d0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
183e0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
183f0 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18400 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18410 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18420 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18430 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18440 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18450 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18460 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18470 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18480 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18490 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
184a0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
184b0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
184c0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
184d0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
184e0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
184f0 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18500 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18510 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18520 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18530 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18540 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18550 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18560 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18570 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18580 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
18590 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
185a0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
185b0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
185c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
185d0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
185e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
185f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18600 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18610 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18620 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18630 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18640 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18650 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18660 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18670 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18680 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
18690 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
186a0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
186b0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
186c0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
186d0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
186e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
186f0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18710 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18720 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18730 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18740 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18750 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18760 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18770 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18780 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18790 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
187a0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
187b0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
187c0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
187d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
187e0 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
187f0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18800 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18810 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18820 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18830 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18840 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18860 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18870 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18880 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18890 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
188a0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
188b0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
188c0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
188d0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
188e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
188f0 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18900 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18910 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18920 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18930 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18940 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18950 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18960 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18970 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18980 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18990 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
189a0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
189b0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
189c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
189d0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
189e0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
189f0 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18a00 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18a10 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18a20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18a30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18a40 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18a50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18a60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18a70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18a80 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18a90 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18aa0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18ab0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18ad0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18ae0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18af0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18b00 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18b10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18b20 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18b30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18b40 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18b50 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18b60 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18b70 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18b80 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18b90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18ba0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18bb0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18bd0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18be0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18bf0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18c00 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18c10 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18c20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18c30 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18c40 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18c50 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18c60 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18c80 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18c90 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18ca0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18cb0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18cc0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18cd0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18ce0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
18cf0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
18d00 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
18d10 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
18d20 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
18d30 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
18d40 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
18d50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
18d60 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
18d70 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
18d80 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
18d90 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
18da0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
18db0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
18dc0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
18dd0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
18de0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
18df0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
18e00 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
18e10 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
18e20 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
18e30 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18e40 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
18e50 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18e60 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
18e70 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
18e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18e90 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18ea0 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20  ByCol>0.        
18eb0 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e    && pItem->u.x.
18ec0 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
18ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
18ee0 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
18ef0 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
18f00 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
18f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
18f20 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
18f30 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
18f40 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
18f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
18f60 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
18f70 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
18f80 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18f90 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
18fa0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
18fb0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
18fc0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
18fd0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
18fe0 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
18ff0 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
19000 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19010 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
19020 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
19030 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
19040 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
19050 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
19060 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
19070 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
19080 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
19090 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
190a0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
190b0 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
190c0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
190d0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
190e0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
190f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19100 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
19110 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
19120 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
19130 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
19140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19150 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
19160 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
19170 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19180 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
19190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
191a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
191b0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
191c0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
191d0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
191e0 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
191f0 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
19200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19210 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
19220 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
19230 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
19240 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
19250 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
19260 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
19270 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
19280 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
19290 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
192a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
192b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
192c0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
192d0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
192e0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
192f0 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
19300 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
19310 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
19320 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
19330 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19340 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
19350 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
19360 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
19370 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
19380 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
19390 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
193a0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
193b0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
193c0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
193d0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
193e0 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
193f0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
19400 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
19410 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
19420 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
19430 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
19440 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
19450 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
19460 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19470 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
19480 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
194a0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
194b0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
194c0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
194d0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
19500 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
19510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19520 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
19530 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
19540 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
19550 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
19560 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
19570 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
19580 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
19590 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
195a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
195b0 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
195c0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
195d0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
195e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
195f0 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
19600 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19610 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
19620 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
19630 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
19640 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
19650 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
19660 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
19670 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
19680 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19690 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
196a0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
196b0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
196c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
196d0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
196e0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
196f0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
19700 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
19710 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
19720 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
19730 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
19740 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
19750 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19760 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
19770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19780 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
19790 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
197a0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
197b0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
197c0 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
197d0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
197e0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
197f0 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ;.  explainSetIn
19800 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
19810 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
19820 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
19830 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
19840 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
19850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19860 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
19870 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
19880 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
19890 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
198a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
198b0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
198c0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
198d0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
198e0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
198f0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
19900 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19910 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
19920 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
19930 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
19940 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19950 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19960 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19970 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19980 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19990 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
199a0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
199b0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
199c0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
199d0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
199e0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
199f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19a00 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19a10 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19a20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19a30 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19a40 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19a50 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19a60 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19a70 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19a80 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19aa0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19ab0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19ac0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19ad0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19ae0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19af0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19b00 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
19b10 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19b20 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19b30 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19b40 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19b50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19b60 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
19b70 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
19b80 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
19b90 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
19ba0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19bb0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
19bc0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
19bf0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
19c00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19c10 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19c20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
19c30 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
19c40 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
19c50 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
19c60 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
19c70 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
19c80 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19c90 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19ca0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
19cb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19cc0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19cd0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
19ce0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
19cf0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19d00 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19d10 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19d20 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
19d30 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
19d40 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19d50 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19d60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
19d70 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
19d80 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
19d90 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19da0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19db0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19dc0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
19dd0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19de0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19df0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
19e00 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
19e10 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
19e20 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19e30 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19e40 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
19e50 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
19e60 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19e70 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
19e80 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19e90 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
19ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19eb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19ec0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
19ed0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19ee0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19f00 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
19f10 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
19f40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f60 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19f70 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
19f80 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
19f90 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
19fa0 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tRow;.  }..  /* 
19fb0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19fc0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
19fd0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
19fe0 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
19ff0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1a000 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1a010 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1a020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1a030 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1a040 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1a050 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1a060 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1a070 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1a080 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1a090 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1a0a0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1a0b0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1a0c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1a0d0 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1a0e0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1a0f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a100 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a110 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1a120 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1a130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a140 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a150 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1a160 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a180 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a190 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
1a1a0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a1b0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a1c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1a1d0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a1e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1a1f0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a200 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1a210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a220 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a230 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1a240 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a250 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a260 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1a270 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1a280 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1a290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a2a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
1a2b0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
1a2c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a2d0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a2e0 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
1a2f0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1a300 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1a310 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
1a320 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
1a330 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1a340 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1a350 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
1a360 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1a370 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a380 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
1a390 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a3a0 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
1a3b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a3c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a3d0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1a3e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a3f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a410 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
1a420 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1a430 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a440 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a450 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1a460 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a470 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1a480 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1a490 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a4a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1a4b0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a4c0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1a4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a4e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a4f0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1a500 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1a510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a520 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a530 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1a540 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1a550 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a570 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
1a580 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
1a590 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
1a5a0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
1a5b0 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
1a5c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a5d0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71  ere(v, j1);.  sq
1a5e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a600 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1a610 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1a620 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1a630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a640 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a650 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a660 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1a670 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1a680 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1a690 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1a6a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a6b0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a6d0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1a6e0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1a6f0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1a700 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1a710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a720 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1a730 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1a740 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1a750 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a770 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1a780 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1a790 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1a7a0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1a7b0 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1a7c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a7d0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1a7e0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1a7f0 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1a800 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1a810 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1a820 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1a830 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1a840 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1a850 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a860 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1a870 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1a880 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1a890 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
1a8a0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
1a8b0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
1a8c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
1a8d0 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
1a8e0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
1a8f0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
1a900 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
1a910 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
1a920 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1a930 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
1a940 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1a950 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1a960 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1a970 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1a980 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1a990 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1a9a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1a9b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1a9c0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1a9d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1a9e0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1a9f0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1aa00 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1aa10 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1aa20 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1aa30 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1aa40 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1aa50 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1aa60 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1aa70 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1aa80 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1aa90 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1aaa0 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1aab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aac0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1aad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1aae0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1aaf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ab00 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1ab10 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1ab20 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1ab30 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1ab40 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1ab50 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1ab60 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1ab70 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1ab80 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1ab90 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1aba0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
1abb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1abc0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1abd0 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1abe0 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1abf0 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1ac00 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1ac10 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1ac20 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1ac30 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1ac40 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1ac50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1ac60 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1ac70 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1ac80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ac90 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1aca0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1acb0 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1acc0 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1acd0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1ace0 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1acf0 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1ad00 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1ad10 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1ad20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1ad30 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1ad40 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1ad50 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1ad60 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1ad70 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
1ad80 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1ad90 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1ada0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1adb0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1adc0 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1add0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1ade0 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1adf0 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1ae00 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1ae10 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1ae20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ae30 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1ae40 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
1ae50 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ae60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1ae70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
1ae80 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1ae90 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1aea0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1aeb0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1aec0 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1aed0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1aee0 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
1aef0 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
1af00 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
1af10 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1af20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1af30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1af40 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1af50 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
1af60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1af70 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1af80 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1af90 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1afa0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1afb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1afc0 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1afd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
1afe0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1aff0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1b000 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1b010 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1b020 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
1b030 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1b040 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
1b050 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1b060 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
1b070 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1b080 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1b090 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1b0a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b0b0 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
1b0c0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b0d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
1b0e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b0f0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1b100 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b110 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1b120 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b130 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1b140 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1b150 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1b160 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b170 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b180 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b190 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  pEList);.    }el
1b1a0 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1b1b0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
1b1c0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
1b1d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b1e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b1f0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1b200 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1b210 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
1b220 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1b230 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1b240 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
1b250 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1b260 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1b270 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1b280 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1b290 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
1b2a0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1b2b0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1b2c0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1b2d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1b2e0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1b2f0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
1b300 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b310 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1b320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b330 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b340 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1b350 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1b360 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
1b370 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
1b380 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
1b390 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b3a0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
1b3b0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1b3c0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b3d0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1b3e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1b3f0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1b400 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1b410 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1b420 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1b430 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b440 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b450 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
1b460 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b470 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b480 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b490 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b4a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1b4b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b4c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
1b4d0 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75  p ) return;.  su
1b4e0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b4f0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
1b500 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1b510 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b520 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
1b530 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b540 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b550 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1b560 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b570 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1b580 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b590 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
1b5a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
1b5b0 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1b5c0 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
1b5d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b5e0 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28  ;.  substSelect(
1b5f0 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  db, p->pPrior, i
1b600 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b610 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1b620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1b630 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72   );  /* Even for
1b640 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68   (SELECT 1) we h
1b650 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74  ave: pSrc!=0 but
1b660 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a   pSrc->nSrc==0 *
1b670 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1b680 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  Src) ){.    for(
1b690 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1b6a0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1b6b0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1b6c0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b6d0 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  ct(db, pItem->pS
1b6e0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b6f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1b700 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
1b710 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b720 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b730 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b740 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1b750 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b760 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b770 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1b780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1b790 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b7a0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1b7b0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1b7c0 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1b7d0 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1b7e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b7f0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1b800 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1b810 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1b820 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1b830 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1b840 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1b850 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1b860 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1b870 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1b880 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1b890 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1b8a0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b8b0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1b8c0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1b8d0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1b8e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1b8f0 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1b900 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1b910 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1b920 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b930 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1b940 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1b950 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1b960 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1b970 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1b980 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1b990 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1b9a0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1b9b0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1b9c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1b9d0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1b9e0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1b9f0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1ba00 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1ba10 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1ba20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ba30 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1ba40 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1ba50 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1ba60 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1ba70 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1ba80 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ba90 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1baa0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1bab0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1bac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1bad0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1bae0 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1baf0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1bb00 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1bb10 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1bb20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1bb30 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1bb40 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1bb50 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1bb60 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1bb70 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1bb80 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1bb90 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1bba0 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1bbb0 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1bbc0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1bbd0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1bbe0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1bbf0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1bc00 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1bc10 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1bc20 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1bc30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bc40 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1bc50 74 65 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f  te or (2a) the o
1bc60 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1bc70 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  t a join.**     
1bc80 20 20 20 61 6e 64 20 28 32 62 29 20 74 68 65 20     and (2b) the 
1bc90 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1bca0 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72   not use subquer
1bcb0 69 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ies other than t
1bcc0 68 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  he one.**       
1bcd0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
1bce0 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20  query that is a 
1bcf0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c  candidate for fl
1bd00 61 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69  attening.  (2b i
1bd10 73 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20  s.**        due 
1bd20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37  to ticket [2f717
1bd30 30 64 37 33 62 66 39 61 62 66 38 30 5d 20 66 72  0d73bf9abf80] fr
1bd40 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a  om 2015-02-09.).
1bd50 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
1bd60 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1bd70 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1bd80 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1bd90 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
1bda0 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
1bdb0 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
1bdc0 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b  ngthened by tick
1bdd0 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
1bde0 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
1bdf0 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
1be00 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  NCT..**.**  (**)
1be10 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72    At one point r
1be20 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20  estrictions (4) 
1be30 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20  and (5) defined 
1be40 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54  a subset of DIST
1be50 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73  INCT.**        s
1be60 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20  ub-queries that 
1be70 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72  were excluded fr
1be80 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  om this optimiza
1be90 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f  tion. Restrictio
1bea0 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29  n .**        (4)
1beb0 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20   has since been 
1bec0 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c  expanded to excl
1bed0 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54  ude all DISTINCT
1bee0 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a   subqueries..**.
1bef0 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
1bf00 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1bf10 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
1bf20 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1bf30 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1bf40 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
1bf50 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1bf60 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
1bf70 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a  M clause.  TODO:
1bf80 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73    For subqueries
1bf90 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20   without.**     
1bfa0 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65     A FROM clause
1bfb0 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e  , consider addin
1bfc0 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77  g a FROM close w
1bfd0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1bfe0 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1bff0 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1c000 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1c010 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1c020 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1c030 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1c040 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
1c050 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c060 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1c070 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c080 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
1c090 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
1c0a0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1c0b0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1c0c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1c0d0 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
1c0e0 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
1c0f0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1c100 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1c110 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1c120 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1c130 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1c140 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1c150 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1c160 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1c170 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1c180 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1c190 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20 73      text: "The s
1c1a0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c1b0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1c1c0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1c1d0 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1c1e0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
1c1f0 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ".**.**  (11)  T
1c200 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c210 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1c220 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
1c230 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c240 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1c250 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1c260 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1c270 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1c280 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1c290 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1c2a0 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1c2b0 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1c2c0 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1c2d0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
1c2e0 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
1c2f0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1c300 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  th use LIMIT..**
1c310 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
1c320 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1c330 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
1c340 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
1c350 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c360 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1c370 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
1c380 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
1c390 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
1c3a0 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ve a LIMIT claus
1c3b0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  e..**        (Se
1c3c0 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1c3d0 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1c3e0 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1c3f0 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20  (16)  The outer 
1c400 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1c410 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
1c420 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a   subquery does.*
1c430 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e  *        not con
1c440 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20  tain ORDER BY.  
1c450 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20  (Ticket #2942)  
1c460 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74  This used to not
1c470 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20   matter.**      
1c480 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f    until we intro
1c490 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f  duced the group_
1c4a0 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
1c4b0 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29  n.  .**.**  (17)
1c4c0 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20    The sub-query 
1c4d0 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  is not a compoun
1c4e0 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20  d select, or it 
1c4f0 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a  is a UNION ALL .
1c500 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1c510 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  nd clause made u
1c520 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f  p entirely of no
1c530 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1c540 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  ies, and .**    
1c550 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71      the parent q
1c560 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1c570 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74       * is not it
1c580 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63  self part of a c
1c590 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a  ompound select,.
1c5a0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1c5b0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1c5c0 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75  e or DISTINCT qu
1c5d0 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ery, and.**     
1c5e0 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20       * is not a 
1c5f0 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  join.**.**      
1c600 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
1c610 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
1c620 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
1c630 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
1c640 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
1c650 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
1c660 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
1c670 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
1c680 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
1c690 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1c6a0 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
1c6b0 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
1c6c0 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
1c6d0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1c6e0 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
1c6f0 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
1c700 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
1c710 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c720 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
1c730 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
1c740 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
1c750 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
1c760 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
1c770 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
1c780 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
1c790 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
1c7a0 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
1c7b0 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
1c7c0 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
1c7d0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
1c7e0 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
1c7f0 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
1c800 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
1c810 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
1c820 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
1c830 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
1c840 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
1c850 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
1c860 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
1c870 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
1c880 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
1c890 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
1c8a0 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
1c8b0 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
1c8c0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
1c8d0 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
1c8e0 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
1c8f0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1c900 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1c910 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
1c920 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
1c930 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
1c940 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
1c950 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
1c960 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
1c970 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
1c980 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
1c990 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
1c9a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1c9b0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1c9c0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1c9d0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1c9e0 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
1c9f0 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
1ca00 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
1ca10 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1ca20 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1ca30 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
1ca40 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1ca50 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1ca60 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
1ca70 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
1ca80 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
1ca90 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
1caa0 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
1cab0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
1cac0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1cad0 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
1cae0 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
1caf0 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
1cb00 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
1cb10 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
1cb20 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
1cb30 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
1cb40 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
1cb50 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
1cb60 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
1cb70 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1cb80 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1cb90 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1cba0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1cbb0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1cbc0 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b  .  (See ticket [
1cbd0 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a  752e1646fc])..**
1cbe0 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73  .**  (22)  The s
1cbf0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1cc00 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a   recursive CTE..
1cc10 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65  **.**  (23)  The
1cc20 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61   parent is not a
1cc30 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1cc40 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  or the sub-query
1cc50 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20   is not a.**    
1cc60 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65      compound que
1cc70 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63  ry. This restric
1cc80 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
1cc90 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
1cca0 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e  .**        paren
1ccb0 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t to a compound 
1ccc0 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74  query confuses t
1ccd0 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e  he code that han
1cce0 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72  dles.**        r
1ccf0 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
1cd00 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28   in multiSelect(
1cd10 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20  )..**.**  (24)  
1cd20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1cd30 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1cd40 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62   that uses the b
1cd50 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72  uilt-in min() or
1cd60 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d   .**        or m
1cd70 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ax() functions. 
1cd80 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72   (Without this r
1cd90 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75  estriction, a qu
1cda0 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20  ery like:.**    
1cdb0 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52      "SELECT x FR
1cdc0 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79  OM (SELECT max(y
1cdd0 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77  ), x FROM t1)" w
1cde0 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61  ould not necessa
1cdf0 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  rily.**        r
1ce00 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1ce10 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61  X for which Y wa
1ce20 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a  s maximal.).**.*
1ce30 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75  *.** In this rou
1ce40 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61  tine, the "p" pa
1ce50 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
1ce60 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65  nter to the oute
1ce70 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20  r query..** The 
1ce80 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70  subquery is p->p
1ce90 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20  Src->a[iFrom].  
1cea0 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  isAgg is true if
1ceb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cec0 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61  .** uses aggrega
1ced0 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79  tes and subquery
1cee0 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66  IsAgg is true if
1cef0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1cf00 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  es aggregates..*
1cf10 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  *.** If flatteni
1cf20 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ng is not attemp
1cf30 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ted, this routin
1cf40 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64  e is a no-op and
1cf50 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49   returns 0..** I
1cf60 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1cf70 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72  attempted this r
1cf80 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
1cf90 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74  ..**.** All of t
1cfa0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
1cfb0 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75  alysis must occu
1cfc0 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75  r on both the ou
1cfd0 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a  ter query and.**
1cfe0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65   the subquery be
1cff0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1d000 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  e runs..*/.stati
1d010 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62  c int flattenSub
1d020 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  query(.  Parse *
1d030 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1d040 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1d050 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1d060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d070 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65  e parent or oute
1d080 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
1d090 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  nt */.  int iFro
1d0a0 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m,           /* 
1d0b0 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63  Index in p->pSrc
1d0c0 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e  ->a[] of the inn
1d0d0 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  er subquery */. 
1d0e0 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20   int isAgg,     
1d0f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d100 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73   outer SELECT us
1d110 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1d120 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
1d130 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20  subqueryIsAgg   
1d140 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1d150 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
1d160 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1d170 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
1d180 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
1d190 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
1d1a0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
1d1b0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1d1c0 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  t;.  Select *pSu
1d1d0 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
1d1e0 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22  inner query or "
1d1f0 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53  subquery" */.  S
1d200 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20  elect *pSub1;   
1d210 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d220 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73   the rightmost s
1d230 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65  elect in sub-que
1d240 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
1d250 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  *pSrc;      /* T
1d260 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d270 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1d280 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1d290 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68  pSubSrc;   /* Th
1d2a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d2b0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1d2c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1d2d0 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  st;    /* The re
1d2e0 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1d2f0 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1d300 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
1d310 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1d320 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
1d330 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65  e pSub result se
1d340 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  t temp table */.
1d350 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1d360 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1d370 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20  unter */.  Expr 
1d380 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1d390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d3a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1d3b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1d3c0 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74  ist_item *pSubit
1d3d0 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62  em;   /* The sub
1d3e0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
1d3f0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d400 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  >db;..  /* Check
1d410 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74   to see if flatt
1d420 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1d430 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ed.  Return 0 if
1d440 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   not..  */.  ass
1d450 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
1d460 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
1d470 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c  ==0 );  /* Unabl
1d480 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d  e to flatten com
1d490 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f  pound queries */
1d4a0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
1d4b0 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20  ionDisabled(db, 
1d4c0 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
1d4d0 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20  tener) ) return 
1d4e0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
1d4f0 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
1d500 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
1d510 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
1d520 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
1d530 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
1d540 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
1d550 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
1d560 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
1d570 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1d580 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
1d590 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75  0 );.  if( subqu
1d5a0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1d5b0 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75  if( isAgg ) retu
1d5c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d5f0 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20  ion (1)   */.   
1d600 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e   if( pSrc->nSrc>
1d610 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d640 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20  tion (2a)  */.  
1d650 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65    if( (p->pWhere
1d660 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
1d670 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50  rty(p->pWhere,EP
1d680 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20  _Subquery)).    
1d690 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72   || (sqlite3Expr
1d6a0 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c  ListFlags(p->pEL
1d6b0 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65  ist) & EP_Subque
1d6c0 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28  ry)!=0.     || (
1d6d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
1d6e0 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79  lags(p->pOrderBy
1d6f0 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29  ) & EP_Subquery)
1d700 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1d710 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1d750 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20  on (2b)  */.    
1d760 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75  }.  }.    .  pSu
1d770 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1d780 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
1d790 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
1d7a0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
1d7b0 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
1d7c0 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
1d7d0 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
1d7e0 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
1d7f0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1d800 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
1d810 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
1d820 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
1d830 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
1d840 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
1d850 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
1d860 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
1d870 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1d880 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
1d890 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1d8a0 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
1d8b0 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
1d8c0 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
1d8d0 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
1d8e0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1d8f0 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
1d900 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1d910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d920 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
1d930 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
1d940 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
1d950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d970 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
1d980 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1d990 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75  lags & SF_Compou
1d9a0 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e  nd)!=0 && pSub->
1d9b0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
1d9c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1da00 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
1da10 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1da20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1da50 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
1da60 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1da70 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1da80 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1da90 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1daa0 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
1dab0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dac0 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
1dad0 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
1dae0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1daf0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1db00 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
1db10 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1db20 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1db30 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
1db40 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1db50 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1db60 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1db70 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
1db80 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1db90 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1dba0 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
1dbb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dbe0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1dbf0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
1dc00 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
1dc10 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
1dc20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1dc30 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dc40 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
1dc50 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1dc60 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
1dc70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1dc80 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dc90 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
1dca0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1dcb0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1dcc0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
1dcd0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1dce0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1dcf0 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
1dd00 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
1dd10 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1dd20 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b   SF_Recursive );
1dd30 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75  .  testcase( pSu
1dd40 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1dd50 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20  _MinMaxAgg );.  
1dd60 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1dd70 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
1dd80 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29  ve|SF_MinMaxAgg)
1dd90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1dda0 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e  ; /* Restriction
1ddb0 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20  s (22) and (24) 
1ddc0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1ddd0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1dde0 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75  ecursive) && pSu
1ddf0 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
1de00 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
1de10 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a  striction (23) *
1de20 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f  /.  }..  /* OBSO
1de30 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
1de40 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
1de50 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
1de60 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
1de70 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1de80 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
1de90 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
1dea0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1deb0 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
1dec0 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
1ded0 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
1dee0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
1def0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
1df00 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1df10 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
1df20 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1df30 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1df40 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1df50 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1df60 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1df70 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
1df80 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
1df90 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
1dfa0 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
1dfb0 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
1dfc0 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
1dfd0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
1dfe0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1dff0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
1e000 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
1e010 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
1e020 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
1e030 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
1e040 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
1e050 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
1e060 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
1e070 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1e080 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1e090 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1e0a0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1e0b0 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
1e0c0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1e0d0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1e0e0 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1e0f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1e100 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1e110 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
1e120 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
1e130 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
1e140 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
1e150 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
1e160 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
1e170 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
1e180 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
1e190 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
1e1a0 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
1e1b0 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
1e1c0 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
1e1d0 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
1e1e0 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
1e1f0 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
1e200 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
1e210 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
1e220 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
1e230 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
1e240 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
1e250 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
1e260 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
1e270 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1e280 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
1e290 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
1e2a0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
1e2b0 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
1e2c0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
1e2d0 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1e2e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1e2f0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1e300 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
1e310 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1e320 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1e330 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
1e340 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
1e350 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
1e360 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
1e370 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
1e380 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
1e390 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
1e3a0 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
1e3b0 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
1e3c0 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
1e3d0 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
1e3e0 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
1e3f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
1e400 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
1e410 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1e420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1e430 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e440 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   20 */.    }.   
1e450 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
1e460 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1e470 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
1e480 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
1e490 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1e4a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1e4b0 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
1e4c0 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
1e4d0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
1e4e0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1e4f0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1e500 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1e510 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
1e520 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
1e530 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1e540 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1e550 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1e560 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
1e570 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
1e580 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
1e590 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1e5a0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1e5b0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1e5c0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
1e5d0 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
1e5e0 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1e5f0 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1e600 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
1e610 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
1e620 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e         || pSub->
1e630 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
1e640 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
1e650 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  xpr.      ){.   
1e660 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1e670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
1e680 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
1e690 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
1e6a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
1e6b0 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
1e6c0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1e6d0 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
1e6e0 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
1e6f0 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
1e700 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
1e710 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1e720 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
1e730 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1e740 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e760 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  }..  /***** If w
1e770 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
1e780 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
1e790 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
1e7a0 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
1e7b0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
1e7c0 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f  latten %s.%p fro
1e7d0 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pSub->zSelName,
1e800 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a   pSub, iFrom));.
1e810 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
1e820 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1e830 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1e840 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
1e850 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
1e860 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
1e870 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1e880 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
1e890 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
1e8a0 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
1e8b0 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
1e8c0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1e8d0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
1e8e0 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
1e8f0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1e900 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
1e910 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
1e920 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
1e930 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
1e940 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
1e950 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
1e960 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
1e970 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
1e980 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
1e990 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1e9a0 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
1e9b0 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
1e9c0 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
1e9d0 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
1e9e0 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
1e9f0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
1ea00 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
1ea10 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
1ea20 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
1ea30 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
1ea40 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
1ea50 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
1ea60 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
1ea70 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
1ea80 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
1ea90 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
1eaa0 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
1eab0 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
1eac0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1ead0 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
1eae0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
1eaf0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
1eb00 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1eb10 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
1eb20 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
1eb30 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
1eb40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1eb50 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
1eb60 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1eb70 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
1eb80 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1eb90 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1eba0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
1ebb0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1ebc0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ebd0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1ebe0 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
1ebf0 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
1ec00 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
1ec10 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
1ec20 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
1ec30 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1ec40 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
1ec50 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
1ec60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1ec70 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
1ec80 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
1ec90 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
1eca0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1ecb0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1ecc0 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
1ecd0 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
1ece0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
1ecf0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1ed00 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
1ed10 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
1ed20 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
1ed30 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
1ed40 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
1ed50 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
1ed60 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
1ed70 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
1ed80 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1ed90 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
1eda0 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
1edb0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
1edc0 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73  .    Expr *pOffs
1edd0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
1ede0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
1edf0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
1ee00 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
1ee10 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
1ee20 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
1ee30 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
1ee40 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
1ee50 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
1ee60 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1ee70 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
1ee80 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   p, 0);.    sqli
1ee90 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
1eea0 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65  (pNew, pSub->zSe
1eeb0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  lName);.    p->p
1eec0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
1eed0 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1eee0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
1eef0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1ef00 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
1ef10 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
1ef20 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
1ef30 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1ef40 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
1ef50 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
1ef60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
1ef70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1ef80 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  r;.      if( pPr
1ef90 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e  ior ) pPrior->pN
1efa0 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
1efb0 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1efc0 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  p;.      p->pPri
1efd0 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  or = pNew;.     
1efe0 20 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70   SELECTTRACE(2,p
1eff0 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20  Parse,p,.       
1f000 20 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62    ("compound-sub
1f010 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20  query flattener 
1f020 63 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73  creates %s.%p as
1f030 20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20   peer\n",.      
1f040 20 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d     pNew->zSelNam
1f050 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d  e, pNew));.    }
1f060 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1f070 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1f080 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1f090 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67  Begin flattening
1f0a0 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e   the iFrom-th en
1f0b0 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
1f0c0 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20  clause .  ** in 
1f0d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1f0e0 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70  .  */.  pSub = p
1f0f0 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d  Sub1 = pSubitem-
1f100 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20  >pSelect;..  /* 
1f110 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73  Delete the trans
1f120 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
1f130 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20  ture associated 
1f140 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
1f150 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71  bquery.  */.  sq
1f160 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f170 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1f180 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ase);.  sqlite3D
1f190 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
1f1a0 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  em->zName);.  sq
1f1b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f1c0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
1f1d0 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  );.  pSubitem->z
1f1e0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1f1f0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pSubitem->zName 
1f200 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1f210 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70  >zAlias = 0;.  p
1f220 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1f230 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65   = 0;..  /* Defe
1f240 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54  r deleting the T
1f250 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f  able object asso
1f260 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
1f270 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e    ** subquery un
1f280 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74  til code generat
1f290 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  ion is.  ** comp
1f2a0 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72  lete, since ther
1f2b0 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73  e may still exis
1f2c0 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72  t Expr.pTab entr
1f2d0 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  ies that.  ** re
1f2e0 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75  fer to the subqu
1f2f0 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66  ery even after f
1f300 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b  lattening.  Tick
1f310 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20  et #3346..  **. 
1f320 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54   ** pSubitem->pT
1f330 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  ab is always non
1f340 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65  -NULL by test re
1f350 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74  strictions and t
1f360 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f  ests above..  */
1f370 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53  .  if( ALWAYS(pS
1f380 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29  ubitem->pTab!=0)
1f390 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1f3a0 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69  TabToDel = pSubi
1f3b0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
1f3c0 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52  f( pTabToDel->nR
1f3d0 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50  ef==1 ){.      P
1f3e0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1f3f0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1f400 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1f410 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1f420 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70  >pNextZombie = p
1f430 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
1f440 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70  eTab;.      pTop
1f450 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61  level->pZombieTa
1f460 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
1f470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f480 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
1f490 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
1f4a0 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
1f4b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1f4c0 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
1f4d0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1f4e0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
1f4f0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
1f500 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
1f510 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1f520 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
1f530 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
1f540 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
1f550 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
1f560 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
1f570 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
1f580 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
1f590 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
1f5a0 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
1f5b0 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
1f5c0 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
1f5d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
1f5e0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
1f5f0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1f600 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
1f610 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1f620 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
1f630 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
1f640 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
1f650 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
1f660 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
1f670 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
1f680 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
1f690 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
1f6a0 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
1f6b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
1f6c0 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
1f6d0 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
1f6e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
1f6f0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
1f700 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
1f710 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
1f720 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
1f730 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
1f740 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
1f750 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
1f760 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
1f770 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
1f780 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
1f790 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
1f7a0 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
1f7b0 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
1f7c0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1f7d0 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
1f7e0 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e  Src;.    u8 join
1f7f0 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
1f800 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1f810 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1f820 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
1f830 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
1f840 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
1f850 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
1f860 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
1f870 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
1f880 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
1f890 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
1f8a0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1f8b0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1f8c0 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
1f8d0 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
1f8e0 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
1f8f0 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
1f900 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
1f910 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
1f920 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
1f930 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
1f940 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1f950 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
1f960 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
1f970 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
1f980 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
1f990 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
1f9a0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
1f9b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1f9c0 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
1f9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
1f9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1f9f0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1fa00 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1fa10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fa20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1fa30 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
1fa40 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
1fa50 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1fa60 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
1fa70 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
1fa80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
1fa90 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
1faa0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
1fab0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
1fac0 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
1fad0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fae0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
1faf0 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
1fb00 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
1fb10 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1fb20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fb30 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
1fb40 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
1fb50 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
1fb60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
1fb70 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
1fb80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1fb90 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
1fba0 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
1fbb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
1fbc0 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
1fbd0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1fbe0 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
1fbf0 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
1fc00 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
1fc10 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
1fc20 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
1fc30 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20   expand the out 
1fc40 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73  query to 4 slots
1fc50 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20  .  The middle.  
1fc60 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70    ** slot is exp
1fc70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
1fc80 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
1fc90 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ake space for th
1fca0 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65  e.    ** two ele
1fcb0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
1fcc0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fcd0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
1fce0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
1fcf0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
1fd00 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
1fd10 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1fd20 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
1fd30 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
1fd40 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
1fd50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1fd60 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
1fd70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1fd80 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
1fd90 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
1fda0 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
1fdb0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1fdc0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1fdd0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
1fde0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
1fdf0 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
1fe00 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1fe10 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d  Delete(db, pSrc-
1fe20 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69  >a[i+iFrom].pUsi
1fe30 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  ng);.      pSrc-
1fe40 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
1fe50 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
1fe60 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53     memset(&pSubS
1fe70 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a  rc->a[i], 0, siz
1fe80 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69  eof(pSubSrc->a[i
1fe90 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ]));.    }.    p
1fea0 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f  Src->a[iFrom].jo
1feb0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
1fec0 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
1fed0 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
1fee0 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
1fef0 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
1ff00 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
1ff10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1ff20 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
1ff30 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1ff40 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
1ff50 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
1ff60 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
1ff70 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
1ff80 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
1ff90 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
1ffa0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
1ffb0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
1ffc0 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
1ffd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
1ffe0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
1fff0 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
20000 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
20010 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
20020 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
20030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20040 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
20050 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
20060 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
20070 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
20080 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
20090 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
200a0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
200b0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
200c0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
200d0 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
200e0 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
200f0 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50  /.    pList = pP
20100 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  arent->pEList;. 
20110 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
20120 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
20130 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  {.      if( pLis
20140 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30  t->a[i].zName==0
20150 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
20160 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
20170 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c  3DbStrDup(db, pL
20180 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
20190 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
201a0 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
201b0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
201c0 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  a[i].zName = zNa
201d0 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
201e0 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  }.    substExprL
201f0 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
20200 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74  >pEList, iParent
20210 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20220 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29  .    if( isAgg )
20230 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
20240 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
20250 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61  t->pGroupBy, iPa
20260 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
20270 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
20280 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
20290 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
202a0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
202b0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
202c0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
202d0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
202e0 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  By ){.      /* A
202f0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e  t this point, an
20300 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65  y non-zero iOrde
20310 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e  rByCol values in
20320 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
20330 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
20340 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  Y column express
20350 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c  ion is identical
20360 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79   to the iOrderBy
20370 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20  Col'th.      ** 
20380 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72  expression retur
20390 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74  ned by SELECT st
203a0 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69  atement pSub. Si
203b0 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  nce these values
203c0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  .      ** do not
203d0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72   necessarily cor
203e0 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d  respond to colum
203f0 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61  ns in SELECT sta
20400 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a  tement pParent,.
20410 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68        ** zero th
20420 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66  em before transf
20430 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ering the ORDER 
20440 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20  BY clause..     
20450 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
20460 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20   doing this may 
20470 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69  cause an error i
20480 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63  f a subsequent c
20490 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
204a0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74    ** function at
204b0 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
204c0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  n a compound sub
204d0 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72  -query into pPar
204e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  ent.      ** (th
204f0 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20  e only way this 
20500 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66  can happen is if
20510 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
20520 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20  b-query is.     
20530 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61   ** currently pa
20540 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63  rt of pSub->pSrc
20550 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64  ). See ticket [d
20560 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a  11a6e908f].  */.
20570 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
20580 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
20590 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
205a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
205b0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
205c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  ){.        pOrde
205d0 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f  rBy->a[i].u.x.iO
205e0 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
205f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
20600 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
20610 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
20620 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
20630 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
20640 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
20650 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
20660 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
20670 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
20680 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e  }else if( pParen
20690 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  t->pOrderBy ){. 
206a0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
206b0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
206c0 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e  pOrderBy, iParen
206d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
206e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
206f0 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a  pSub->pWhere ){.
20700 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73        pWhere = s
20710 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
20720 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20  , pSub->pWhere, 
20730 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
20740 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
20750 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
20760 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
20770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20780 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
20790 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
207a0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
207b0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
207c0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
207d0 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
207e0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
207f0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
20800 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
20810 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
20820 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
20830 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20840 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
20850 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
20860 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20  ent->pHaving, . 
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
208a0 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e  db, pSub->pHavin
208b0 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73  g, 0));.      as
208c0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
208d0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
208e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
208f0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
20900 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
20910 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30  Sub->pGroupBy, 0
20920 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20930 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
20940 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
20950 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
20960 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
20970 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
20980 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20990 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
209a0 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
209b0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
209c0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
209d0 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
209e0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
209f0 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
20a00 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
20a10 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
20a20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
20a30 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
20a40 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
20a50 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
20a60 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
20a70 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
20a80 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
20a90 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
20aa0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
20ab0 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
20ac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
20ad0 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
20ae0 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
20af0 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
20b00 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
20b10 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
20b20 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
20b30 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
20b40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
20b50 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
20b60 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
20b70 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
20b80 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
20b90 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
20ba0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20bb0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
20bc0 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
20bd0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
20be0 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
20bf0 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
20c00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
20c10 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23  e(db, pSub1);..#
20c20 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
20c30 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
20c40 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
20c50 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73  & 0x100 ){.    s
20c60 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
20c70 66 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  f("After flatten
20c80 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71  ing:\n");.    sq
20c90 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
20ca0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
20cb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
20cc0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
20cd0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
20ce0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
20cf0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
20d00 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
20d10 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f  /../*.** Based o
20d20 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
20d30 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  f the AggInfo st
20d40 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
20d50 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a  d by the first.*
20d60 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  * argument, this
20d70 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
20d80 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
20d90 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
20da0 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79  *    * the query
20db0 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61   contains just a
20dc0 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74   single aggregat
20dd0 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20  e function,.**  
20de0 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74    * the aggregat
20df0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69  e function is ei
20e00 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61  ther min() or ma
20e10 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a  x(), and.**    *
20e20 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
20e30 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
20e40 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c  unction is a col
20e50 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  umn value..**.**
20e60 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
20e70 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74  bove are true, t
20e80 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  hen WHERE_ORDERB
20e90 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
20ea0 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73  RDERBY_MAX.** is
20eb0 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70   returned as app
20ec0 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20  ropriate. Also, 
20ed0 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
20ee0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
20ef0 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67   .** list of arg
20f00 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
20f10 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62   the aggregate b
20f20 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
20f30 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
20f40 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
20f50 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ve are not met, 
20f60 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
20f70 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45   to 0 and.** WHE
20f80 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
20f90 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
20fa0 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
20fb0 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20  axQuery(AggInfo 
20fc0 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c  *pAggInfo, ExprL
20fd0 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
20fe0 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
20ff0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
21000 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL;          /* 
21010 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
21020 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30  .  *ppMinMax = 0
21030 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
21040 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  ->nFunc==1 ){.  
21050 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
21060 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
21070 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67  0].pExpr; /* Agg
21080 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
21090 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
210a0 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  *pEList = pExpr-
210b0 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f  >x.pList;      /
210c0 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
210d0 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  gg function */..
210e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
210f0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
21100 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  NCTION );.    if
21110 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
21120 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
21130 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
21140 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
21150 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63  OLUMN ){.      c
21160 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
21170 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
21180 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  en;.      if( sq
21190 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
211a0 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
211b0 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
211c0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
211d0 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  N;.        *ppMi
211e0 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
211f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
21200 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
21210 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
21220 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
21230 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
21240 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  AX;.        *ppM
21250 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
21260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21270 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  }..  assert( *pp
21280 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70  MinMax==0 || (*p
21290 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d  pMinMax)->nExpr=
212a0 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
212b0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
212c0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
212d0 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
212e0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
212f0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
21300 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
21310 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
21320 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
21330 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
21340 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
21350 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
21360 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
21370 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
21380 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
21390 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
213a0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
213b0 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
213c0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
213d0 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
213e0 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
213f0 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
21400 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
21410 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
21420 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
21430 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
21440 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
21450 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
21460 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21470 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
21480 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
21490 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
214a0 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
214b0 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
214c0 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
214d0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
214e0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
214f0 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
21500 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
21510 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
21520 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
21530 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
21540 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
21550 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
21560 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
21570 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
21580 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
21590 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
215a0 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
215b0 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
215c0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
215d0 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
215e0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
215f0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
21600 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
21610 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
21620 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
21630 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
21640 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
21650 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
21660 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
21670 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
21680 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
21690 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
216a0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
216b0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
216c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
216d0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
216e0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
216f0 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
21700 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
21710 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
21720 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
21730 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
21740 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
21750 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
21760 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
21770 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
21780 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
21790 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
217a0 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
217b0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
217c0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
217d0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
217e0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
217f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
21800 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
21810 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
21820 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
21830 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21840 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
21850 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
21860 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
21870 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
21880 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
21890 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
218a0 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
218b0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
218c0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
218d0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
218e0 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
218f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
21900 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
21910 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
21920 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
21930 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
21940 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
21950 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21960 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
21970 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
21980 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
21990 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
219a0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
219b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
219c0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
219d0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
219e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
219f0 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
21a00 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
21a10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
21a20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
21a30 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
21a40 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
21a50 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
21a60 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
21a70 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
21a80 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
21a90 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
21aa0 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
21ab0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
21ac0 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
21ad0 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
21ae0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
21af0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
21b00 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
21b10 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
21b20 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
21b30 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
21b40 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
21b50 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
21b60 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
21b70 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
21b80 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
21b90 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
21ba0 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
21bb0 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
21bc0 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
21bd0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
21be0 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
21bf0 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
21c00 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
21c10 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
21c20 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
21c30 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
21c40 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
21c50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
21c60 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
21c70 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
21c80 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
21c90 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
21ca0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
21cb0 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
21cc0 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
21cd0 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
21ce0 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
21cf0 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
21d00 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
21d10 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
21d20 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
21d30 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
21d40 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
21d50 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
21d60 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
21d70 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
21d80 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
21d90 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
21da0 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
21db0 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
21dc0 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
21dd0 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
21de0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
21df0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
21e00 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
21e10 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
21e20 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
21e30 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
21e40 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
21e50 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
21e60 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
21e70 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
21e80 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
21e90 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
21ea0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
21eb0 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
21ec0 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
21ed0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
21ee0 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
21ef0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
21f00 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
21f10 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
21f20 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
21f30 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
21f40 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
21f50 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
21f60 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
21f70 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
21f80 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
21f90 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
21fa0 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
21fb0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
21fc0 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
21fd0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
21fe0 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
21ff0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
22000 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
22010 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
22020 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
22030 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
22040 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
22050 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
22060 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
22070 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
22080 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22090 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
220a0 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
220b0 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
220c0 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
220d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
220e0 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
220f0 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
22100 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
22110 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
22120 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
22130 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
22140 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20   TK_ALL, 0));.  
22150 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
22160 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
22170 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
22180 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
22190 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
221a0 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
221b0 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
221c0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
221d0 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
221e0 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
221f0 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  und;.  assert( p
22200 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29  New->pPrior!=0 )
22210 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
22220 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
22230 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
22240 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66   0;.  pNew->pOff
22250 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  set = 0;.  retur
22260 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22270 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
22280 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
22290 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
222a0 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
222b0 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
222c0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
222d0 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
222e0 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
222f0 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
22300 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
22310 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
22320 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
22330 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
22340 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
22350 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
22360 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
22370 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22380 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
22390 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
223a0 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
223b0 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
223c0 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
223d0 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
223e0 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
223f0 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
22400 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
22410 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
22420 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
22430 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
22440 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
22450 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
22460 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
22470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
22480 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57  rent outermost W
22490 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
224a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
224b0 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
224c0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
224d0 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
224e0 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
224f0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
22500 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
22510 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
22520 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
22530 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
22540 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
22550 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
22560 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
22570 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
22580 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
22590 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
225a0 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
225b0 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
225c0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
225d0 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
225e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
225f0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22600 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
22610 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
22620 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
22630 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
22640 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
22650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22660 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
22670 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
22680 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
22690 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
226a0 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
226b0 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
226c0 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
226d0 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
226e0 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
226f0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
22700 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
22710 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
22720 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
22730 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22740 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
22750 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
22760 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
22770 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
22780 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
22790 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
227a0 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
227b0 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
227c0 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
227d0 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
227e0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
227f0 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
22800 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
22810 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
22820 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
22830 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
22840 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
22850 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
22860 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
22870 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
22880 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
22890 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
228a0 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
228b0 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
228c0 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
228d0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
228e0 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  0 );.  if( pWith
228f0 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   ){.    pWith->p
22900 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
22910 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
22920 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
22930 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46  ;.    pParse->bF
22940 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b  reeWith = bFree;
22950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
22960 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
22970 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
22980 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
22990 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
229a0 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
229b0 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
229c0 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
229d0 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
229e0 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
229f0 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
22a00 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
22a10 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
22a20 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
22a30 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
22a40 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
22a50 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
22a60 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
22a70 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
22a80 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
22a90 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
22aa0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
22ab0 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
22ac0 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
22ad0 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
22ae0 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
22af0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
22b00 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
22b10 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
22b20 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
22b30 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
22b40 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
22b50 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
22b60 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
22b70 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
22b80 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
22b90 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
22ba0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
22bb0 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
22bc0 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
22bd0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
22be0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
22bf0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22c00 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
22c10 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
22c20 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
22c30 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
22c40 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
22c50 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
22c60 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
22c70 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22c80 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
22c90 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
22ca0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
22cb0 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
22cc0 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
22cd0 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
22d00 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
22d10 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
22d20 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
22d30 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
22d40 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
22d50 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
22d60 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
22d70 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
22d80 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
22d90 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
22da0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
22db0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
22dc0 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
22dd0 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
22de0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22df0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
22e00 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
22e10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22e20 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
22e30 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
22e40 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
22e50 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
22e60 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
22e70 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
22e80 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
22e90 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20  * If pCte->zErr 
22ea0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
22eb0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
22ec0 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
22ed0 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
22ee0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
22ef0 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
22f00 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
22f10 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
22f20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
22f30 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55  pCte->zErr is NU
22f40 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
22f50 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
22f60 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
22f70 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
22f80 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
22f90 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72    if( pCte->zErr
22fa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22fb0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22fc0 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43  , pCte->zErr, pC
22fd0 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
22fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22ff0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
23000 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23010 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
23020 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23030 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
23040 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
23050 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
23060 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
23070 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23080 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  .    pTab->nRef 
23090 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
230a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
230b0 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
230c0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
230d0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
230e0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
230f0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
23100 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
23110 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
23120 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
23130 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
23140 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  eral;.    pFrom-
23150 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
23160 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
23170 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
23180 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
23190 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
231a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
231b0 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  M;.    assert( p
231c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b  From->pSelect );
231d0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
231e0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75  f this is a recu
231f0 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20  rsive CTE. */.  
23200 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e    pSel = pFrom->
23210 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61  pSelect;.    bMa
23220 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70  yRecursive = ( p
23230 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  Sel->op==TK_ALL 
23240 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f  || pSel->op==TK_
23250 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  UNION );.    if(
23260 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
23270 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
23280 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
23290 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  rc = pFrom->pSel
232a0 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20  ect->pSrc;.     
232b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
232c0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
232d0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
232e0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
232f0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a   = &pSrc->a[i];.
23300 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
23310 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
23320 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74  .         && pIt
23330 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20  em->zName!=0 .  
23340 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
23350 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65  ite3StrICmp(pIte
23360 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e  m->zName, pCte->
23370 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  zName).         
23380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
23390 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  tem->pTab = pTab
233a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
233b0 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d  m->isRecursive =
233c0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
233d0 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
233e0 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
233f0 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
23400 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
23410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23420 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
23430 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
23440 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
23450 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
23460 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20  b->nRef>2 ){.   
23470 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23480 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
23490 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
234a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
234b0 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
234c0 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
234d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
234e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
234f0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
23500 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66  sert( pTab->nRef
23510 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
23520 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
23530 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
23540 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20  Ref==2 ));..    
23550 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69  pCte->zErr = "ci
23560 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
23570 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
23580 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
23590 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
235a0 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
235b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
235c0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
235d0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f   bMayRecursive ?
235e0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
235f0 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pSel);..    for(
23600 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
23610 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
23620 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
23630 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
23640 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
23650 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
23660 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
23670 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
23680 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
23690 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
236a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
236b0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
236c0 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
236d0 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
236e0 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
236f0 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
23700 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
23710 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
23720 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
23730 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
23740 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
23750 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
23760 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
23770 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
23780 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
23790 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
237a0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
237b0 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
237c0 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
237d0 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
237e0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
237f0 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
23800 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
23810 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
23820 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
23830 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
23840 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
23850 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
23860 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
23870 7a 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76  zErr = "recursiv
23880 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61  e reference in a
23890 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a   subquery: %s";.
238a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
238b0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
238c0 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
238d0 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e      }.    pCte->
238e0 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  zErr = 0;.    pP
238f0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
23900 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
23910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23920 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
23930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23940 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
23950 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
23960 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
23970 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
23980 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
23990 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
239a0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
239b0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
239c0 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
239d0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
239e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
239f0 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
23a00 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
23a10 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
23a20 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
23a30 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
23a40 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
23a50 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
23a60 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
23a70 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
23a80 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
23a90 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
23aa0 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
23ab0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
23ac0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
23ad0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
23ae0 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 20  ;.  With *pWith 
23af0 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28  = findRightmost(
23b00 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28  p)->pWith;.  if(
23b10 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
23b20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
23b30 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
23b40 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
23b50 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
23b60 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  er;.  }.}.#else.
23b70 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f  #define selectPo
23b80 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a  pWith 0.#endif..
23b90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
23ba0 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
23bb0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
23bc0 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
23bd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
23be0 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
23bf0 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
23c00 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
23c10 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
23c20 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
23c30 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
23c40 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
23c50 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
23c60 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
23c70 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
23c80 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
23c90 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
23ca0 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
23cb0 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
23cc0 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
23cd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
23ce0 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
23cf0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
23d00 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
23d10 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
23d20 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
23d30 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
23d40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
23d50 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
23d60 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
23d70 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
23d80 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
23d90 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
23da0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
23db0 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
23dc0 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
23dd0 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
23de0 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
23df0 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
23e00 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
23e10 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
23e20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
23e30 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
23e40 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
23e50 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
23e60 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
23e70 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  se to accommodat
23e80 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
23e90 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
23ea0 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
23eb0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
23ec0 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
23ed0 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
23ee0 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
23ef0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
23f00 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
23f10 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
23f20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
23f30 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
23f40 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
23f50 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
23f60 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
23f70 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
23f80 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
23f90 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
23fa0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
23fb0 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
23fc0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
23fd0 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
23fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
23ff0 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
24000 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
24010 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
24020 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
24030 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
24040 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
24050 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
24060 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
24070 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
24080 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
24090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
240a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
240b0 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74  xpr *pE, *pRight
240c0 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20  , *pExpr;.  u16 
240d0 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65  selFlags = p->se
240e0 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65  lFlags;..  p->se
240f0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
24100 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
24110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
24120 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
24130 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
24140 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d  ( NEVER(p->pSrc=
24150 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73  =0) || (selFlags
24160 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
24170 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24180 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
24190 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
241a0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
241b0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
241c0 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65  ( pWalker->xSele
241d0 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c  ctCallback2==sel
241e0 65 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20  ectPopWith ){.  
241f0 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
24200 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69  h(pParse, findRi
24210 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
24220 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  h, 0);.  }..  /*
24230 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
24240 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
24250 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
24260 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
24270 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
24280 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
24290 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
242a0 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
242b0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
242c0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
242d0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
242e0 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
242f0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
24300 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
24310 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
24320 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
24330 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
24340 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
24350 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
24360 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
24370 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
24380 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
24390 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
243a0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
243b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
243c0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
243d0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
243e0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
243f0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
24400 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
24410 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  m->isRecursive==
24420 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
24430 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
24440 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29  m->isRecursive )
24450 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
24460 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
24470 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
24480 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
24490 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
244a0 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
244b0 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
244c0 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
244d0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
244e0 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  t( i==0 );.#ifnd
244f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
24500 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50  TE.      selectP
24510 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20  opWith(pWalker, 
24520 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  p);.#endif.     
24530 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
24540 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  e;.    }.#ifndef
24550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
24560 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
24570 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
24580 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
24590 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
245a0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
245b0 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
245c0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
245d0 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
245e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
245f0 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
24600 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
24610 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
24620 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
24630 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
24640 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
24650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24660 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
24670 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24680 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
24690 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  if( sqlite3WalkS
246a0 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
246b0 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57 52  Sel) ) return WR
246c0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
246d0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
246e0 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
246f0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
24700 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
24710 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
24720 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24730 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
24740 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
24750 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
24760 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
24770 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28  sqlite_sq_%p", (
24780 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20  void*)pTab);.   
24790 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
247a0 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d  pPrior ){ pSel =
247b0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d   pSel->pPrior; }
247c0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c  .      selectCol
247d0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
247e0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
247f0 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
24800 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
24810 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
24820 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
24830 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
24840 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
24850 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
24860 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
24870 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
24880 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
24890 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
248a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
248b0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
248c0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
248d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
248e0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
248f0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
24900 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
24910 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
24920 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
24930 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
24940 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
24950 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
24960 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24970 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
24980 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a  nRef==0xffff ){.
24990 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
249a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
249b0 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
249c0 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
249d0 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
249e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
249f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
24a00 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
24a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
24a20 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
24a30 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
24a40 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
24a50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
24a60 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
24a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
24a80 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
24a90 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
24aa0 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
24ab0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
24ac0 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
24ad0 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
24ae0 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
24af0 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
24b00 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
24b10 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
24b20 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
24b30 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24b40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24b50 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
24b60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
24b70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
24b80 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
24b90 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
24ba0 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ct, 0);.        
24bb0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
24bc0 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c  Name(pFrom->pSel
24bd0 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ect, pTab->zName
24be0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24bf0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
24c00 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
24c10 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  lect);.      }.#
24c20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
24c30 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69   /* Locate the i
24c40 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68  ndex named by th
24c50 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
24c60 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a  use, if any. */.
24c70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
24c80 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70  ndexedByLookup(p
24c90 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
24ca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
24cb0 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
24cc0 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
24cd0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
24ce0 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53  s, and ON and US
24cf0 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a  ING clauses of j
24d00 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  oins..  */.  if(
24d10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
24d20 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65  d || sqliteProce
24d30 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70  ssJoin(pParse, p
24d40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
24d50 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
24d60 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22    /* For every "
24d70 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  *" that occurs i
24d80 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  n the column lis
24d90 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  t, insert the na
24da0 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20  mes of.  ** all 
24db0 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
24dc0 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20  ables.  And for 
24dd0 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e  every TABLE.* in
24de0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20  sert the names. 
24df0 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d   ** of all colum
24e00 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68  ns in TABLE.  Th
24e10 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74 65  e parser inserte
24e20 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  d a special expr
24e30 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68  ession.  ** with
24e40 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72   the TK_ALL oper
24e50 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
24e60 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
24e70 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
24e80 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  st..  ** The fol
24e90 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
24ea0 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
24eb0 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73  he TK_ALL expres
24ec0 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64  sions and expand
24ed0 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74  .  ** each one t
24ee0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
24ef0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
24f00 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
24f10 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f  ** The first loo
24f20 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f  p just checks to
24f30 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
24f40 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74  e any "*" operat
24f50 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65  ors.  ** that ne
24f60 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20  ed expanding..  
24f70 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
24f80 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
24f90 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45  ++){.    pE = pE
24fa0 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72  List->a[k].pExpr
24fb0 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70  ;.    if( pE->op
24fc0 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
24fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
24fe0 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
24ff0 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
25000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
25010 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
25020 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
25030 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
25040 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
25050 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
25060 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
25070 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
25080 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  k;.  }.  if( k<p
25090 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
250a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
250b0 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
250c0 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
250d0 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
250e0 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
250f0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
25100 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
25110 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
25120 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
25130 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
25140 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
25150 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
25160 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
25170 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
25180 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
25190 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
251a0 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
251b0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
251c0 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
251d0 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
251e0 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
251f0 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
25200 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
25230 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
25240 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  es)==0;..    /* 
25250 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  When processing 
25260 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
25270 75 65 72 69 65 73 2c 20 69 74 20 69 73 20 61 6c  ueries, it is al
25280 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
25290 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63    ** that full_c
252a0 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20  olumn_names=OFF 
252b0 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e  and short_column
252c0 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a  _names=ON.  The.
252d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65      ** sqlite3Re
252e0 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
252f0 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  ) routine makes 
25300 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73  it so. */.    as
25310 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
25320 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
25330 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  om)==0.         
25340 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53 51   || ((flags & SQ
25350 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
25360 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20  s)==0 &&.       
25370 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26 20         (flags & 
25380 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
25390 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20  ames)!=0) );..  
253a0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
253b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
253c0 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
253d0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
253e0 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
253f0 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
25400 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
25410 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
25420 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
25430 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45  p!=TK_ALL && (pE
25440 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25450 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
25460 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
25470 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
25480 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
25490 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
254a0 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
254b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
254c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
254d0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
254e0 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
254f0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
25500 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
25510 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25520 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
25530 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
25540 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
25550 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
25560 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
25570 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
25580 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
25590 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
255a0 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
255b0 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
255c0 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
255d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
255e0 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
255f0 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
25600 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
25610 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
25620 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
25630 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
25640 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
25650 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
25660 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
25670 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
25680 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20   *zTName = 0;   
25690 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
256a0 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
256b0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
256c0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
256d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
256e0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pE->pLeft!=0 );.
256f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25700 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
25710 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50  ty(pE->pLeft, EP
25720 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
25730 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
25740 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54   pE->pLeft->u.zT
25750 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oken;.        }.
25760 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c          for(i=0,
25770 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
25780 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
25790 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
257a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  ++){.          T
257b0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
257c0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  om->pTab;.      
257d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
257e0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
257f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  t;.          cha
25800 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
25810 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
25820 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
25830 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d  r *zSchemaName =
25840 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
25850 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
25860 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
25870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25880 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
25890 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
258a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
258b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
258c0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
258d0 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d        if( pSub==
258e0 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46  0 || (pSub->selF
258f0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
25900 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  From)==0 ){.    
25910 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30          pSub = 0
25920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25930 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
25940 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
25950 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
25960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25970 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
25980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25990 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74       iDb = sqlit
259a0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
259b0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
259c0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
259d0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44  zSchemaName = iD
259e0 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69  b>=0 ? db->aDb[i
259f0 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b  Db].zName : "*";
25a00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25a10 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
25a20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
25a30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
25a40 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
25a50 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
25a60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
25a70 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
25a80 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
25a90 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
25aa0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
25ab0 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
25ac0 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
25ad0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
25ae0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
25af0 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
25b00 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
25b10 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
25b20 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
25b30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25b40 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
25b50 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
25b60 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
25b70 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
25b80 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
25b90 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
25ba0 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
25bb0 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
25bc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25bd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
25be0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
25bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
25c00 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
25c10 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20  ked as 'hidden' 
25c20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20  (currently only 
25c30 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
25c40 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74       ** for virt
25c50 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20  ual tables), do 
25c60 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69  not include it i
25c70 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  n the expanded. 
25c80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
25c90 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20  sult-set list.. 
25ca0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
25cb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
25cc0 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54  HiddenColumn(&pT
25cd0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a  ab->aCol[j]) ){.
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
25cf0 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70  sert(IsVirtual(p
25d00 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab));.         
25d10 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
25d20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25d30 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65           tableSe
25d40 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  en = 1;..       
25d50 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
25d60 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  zTName==0 ){.   
25d70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
25d80 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pFrom->jointype 
25d90 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
25da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25db0 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
25dc0 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
25dd0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
25de0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
25df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25e00 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
25e10 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
25e20 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
25e30 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
25e40 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
25e50 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
25e60 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
25e80 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25ea0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
25eb0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
25ec0 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
25ed0 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
25ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
25ef0 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
25f00 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
25f10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25f30 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
25f40 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
25f50 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
25f70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25fa0 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
25fb0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
25fc0 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
25fd0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
25fe0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
25ff0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
26000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26010 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
26020 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
26030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26040 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
26050 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
26060 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
26070 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
26080 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26090 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
260a0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
260b0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
260c0 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
260d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53            if( zS
260e0 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20  chemaName ){.   
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26100 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
26110 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68  (db, TK_ID, zSch
26120 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  emaName);.      
26130 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
26140 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
26150 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
26160 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29 3b  Left, pExpr, 0);
26170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
26180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26190 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74  zColname = sqlit
261c0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
261d0 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
261e0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
261f0 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
26200 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20   = zColname;.   
26210 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26220 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
26240 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  xpr = pRight;.  
26250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26260 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
26270 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
26280 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
26290 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  w, pExpr);.     
262a0 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
262b0 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  z = zColname;.  
262c0 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
262d0 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  me.n = sqlite3St
262e0 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29  rlen30(zColname)
262f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
26300 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
26310 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65  Name(pParse, pNe
26320 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29  w, &sColname, 0)
26330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26340 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65  ( pNew && (p->se
26350 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
26360 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20  edFrom)!=0 ){.  
26370 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
26380 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
26390 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b   *pX = &pNew->a[
263a0 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  pNew->nExpr-1];.
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
263c0 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( pSub ){.      
263d0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
263e0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
263f0 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  trDup(db, pSub->
26400 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
26410 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  an);.           
26420 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26430 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20  X->zSpan==0 );. 
26440 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
26450 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
26460 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
26470 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
26480 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20  b, "%s.%s.%s",. 
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
264c0 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c  aName, zTabName,
264d0 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
264e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
264f0 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
26500 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
26510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26520 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54      pX->bSpanIsT
26530 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ab = 1;.        
26540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26550 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
26560 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20  db, zToFree);.  
26570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26580 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26590 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
265a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
265b0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
265c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
265d0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
265e0 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
265f0 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
26600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26610 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
26620 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
26630 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
26640 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
26650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26660 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
26670 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
26680 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a  te(db, pEList);.
26690 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20      p->pEList = 
266a0 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51  pNew;.  }.#if SQ
266b0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
266c0 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
266d0 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  && p->pEList->nE
266e0 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
266f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
26700 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
26710 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26720 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
26730 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
26740 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  et");.  }.#endif
26750 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
26760 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
26770 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
26780 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
26790 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
267a0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
267b0 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
267c0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
267d0 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
267e0 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
267f0 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
26800 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
26810 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
26820 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
26830 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
26840 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
26850 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
26860 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
26870 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
26880 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
26890 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
268a0 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
268b0 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
268c0 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73  arser tree..*/.s
268d0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57 61  tatic int exprWa
268e0 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
268f0 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
26900 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
26910 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
26920 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
26930 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
26940 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
26950 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65   This routine "e
26960 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54  xpands" a SELECT
26970 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61   statement and a
26980 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65  ll of its subque
26990 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64  ries..** For add
269a0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
269b0 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d  ion on what it m
269c0 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22  eans to "expand"
269d0 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61   a SELECT.** sta
269e0 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20  tement, see the 
269f0 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73  comment on the s
26a00 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b  electExpand work
26a10 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76  er callback abov
26a20 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69  e..**.** Expandi
26a30 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ng a SELECT stat
26a40 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ement is the fir
26a50 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65  st step in proce
26a60 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43  ssing a.** SELEC
26a70 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
26a80 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
26a90 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e  nt must be expan
26aa0 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61  ded before.** na
26ab0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  me resolution is
26ac0 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a   performed..**.*
26ad0 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  * If anything go
26ae0 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72  es wrong, an err
26af0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72  or message is wr
26b00 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73  itten into pPars
26b10 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  e..** The callin
26b20 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64  g function can d
26b30 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65  etect the proble
26b40 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  m by looking at 
26b50 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20  pParse->nErr.** 
26b60 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64  and/or pParse->d
26b70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e  b->mallocFailed.
26b80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26b90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
26ba0 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  and(Parse *pPars
26bb0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
26bc0 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ct){.  Walker w;
26bd0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
26be0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
26bf0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
26c00 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
26c10 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
26c20 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  se;.  if( pParse
26c30 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b  ->hasCompound ){
26c40 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
26c50 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
26c60 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
26c70 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71  Subquery;.    sq
26c80 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
26c90 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  &w, pSelect);.  
26ca0 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  }.  w.xSelectCal
26cb0 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78  lback = selectEx
26cc0 70 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28 70  pander;.  if( (p
26cd0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
26ce0 20 26 20 53 46 5f 41 6c 6c 56 61 6c 75 65 73 29   & SF_AllValues)
26cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  ==0 ){.    w.xSe
26d00 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
26d10 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20  selectPopWith;. 
26d20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b   }.  sqlite3Walk
26d30 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
26d40 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
26d50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
26d60 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
26d70 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
26d80 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
26d90 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
26da0 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
26db0 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
26dc0 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
26dd0 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
26de0 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
26df0 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
26e00 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
26e10 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
26e20 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
26e30 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
26e40 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
26e50 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
26e60 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
26e70 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
26e80 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
26e90 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
26ea0 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
26eb0 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
26ec0 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
26ed0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
26ee0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
26ef0 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
26f00 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
26f10 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
26f20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
26f30 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
26f40 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
26f50 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
26f60 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
26f70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
26f80 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
26f90 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
26fa0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
26fb0 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
26fc0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
26fd0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
26fe0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
26ff0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
27000 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
27010 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
27020 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28  esolved );.  if(
27030 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
27040 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
27050 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  =0 ){.    p->sel
27060 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
27070 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61  ypeInfo;.    pPa
27080 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
27090 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c  Parse;.    pTabL
270a0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
270b0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
270c0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
270d0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
270e0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
270f0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
27100 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
27110 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
27120 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70  S(pTab!=0) && (p
27130 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
27140 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30  TF_Ephemeral)!=0
27150 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
27160 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
27170 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
27180 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
27190 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
271a0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
271b0 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ct;.        if( 
271c0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
271d0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
271e0 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70  Prior ) pSel = p
271f0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
27200 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64         selectAdd
27210 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
27220 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
27230 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
27240 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27250 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
27260 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
27270 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
27280 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
27290 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
272a0 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
272b0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
272c0 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
272d0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
272e0 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
272f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
27300 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
27310 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
27320 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
27330 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
27340 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
27350 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
27360 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
27370 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27380 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
27390 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
273a0 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
273b0 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63  (w));.  w.xSelec
273c0 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
273d0 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
273e0 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
273f0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
27400 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
27410 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
27420 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
27430 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
27440 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
27450 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
27460 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20  ets up a SELECT 
27470 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72  statement for pr
27480 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a  ocessing.  The.*
27490 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  * following is a
274a0 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a  ccomplished:.**.
274b0 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43  **     *  VDBE C
274c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72  ursor numbers ar
274d0 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  e assigned to al
274e0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65  l FROM-clause te
274f0 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45  rms..**     *  E
27500 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
27510 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
27520 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d  ed for all FROM-
27530 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
27540 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20  s..**     *  ON 
27550 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
27560 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e  s are shifted in
27570 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65  to WHERE stateme
27580 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69  nts.**     *  Wi
27590 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20  ldcards "*" and 
275a0 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73  "TABLE.*" in res
275b0 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70  ult sets are exp
275c0 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20  anded..**     * 
275d0 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
275e0 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d  expression are m
275f0 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73  atched to tables
27600 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27610 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73  tine acts recurs
27620 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62  ively on all sub
27630 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74  queries within t
27640 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
27650 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
27660 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Prep(.  Parse *p
27670 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
27680 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
27690 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
276a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
276b0 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
276c0 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
276d0 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
276e0 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
276f0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
27700 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20  t for container 
27710 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
27720 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  *db;.  if( NEVER
27730 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
27740 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
27750 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  db;.  if( db->ma
27760 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
27770 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
27780 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
27790 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
277a0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
277b0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
277c0 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
277d0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
277e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
277f0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
27800 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
27810 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
27820 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
27830 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
27840 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
27850 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
27860 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
27870 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
27880 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
27890 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
278a0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
278b0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
278c0 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
278d0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
278e0 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
278f0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
27900 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
27910 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
27920 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
27930 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
27940 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
27950 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
27960 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
27970 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
27980 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
27990 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
279a0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
279b0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
279c0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
279d0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
279e0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
279f0 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
27a00 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
27a10 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
27a20 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
27a30 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
27a40 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
27a50 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
27a60 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
27a70 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
27a80 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
27a90 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
27aa0 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
27ab0 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
27ac0 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
27ad0 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
27ae0 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
27af0 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
27b00 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
27b10 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
27b20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27b30 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
27b40 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
27b50 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
27b60 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
27b70 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
27b80 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
27b90 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
27ba0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
27bb0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
27bc0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
27bd0 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
27be0 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
27bf0 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
27c00 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
27c10 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
27c20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
27c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27c40 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
27c50 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
27c60 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
27c70 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
27c80 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
27c90 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
27ca0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
27cb0 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
27cc0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
27cd0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
27ce0 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
27cf0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
27d00 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
27d10 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
27d20 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
27d30 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
27d40 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
27d50 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
27d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
27d70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
27d80 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
27d90 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
27da0 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
27db0 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
27dc0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
27dd0 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
27de0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
27df0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
27e00 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
27e10 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
27e20 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c  pParse, pE->x.pL
27e30 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
27e40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27e50 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
27e60 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
27e70 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
27e80 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
27ea0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
27eb0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
27ec0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
27ed0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
27ee0 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
27ef0 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
27f00 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
27f10 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
27f20 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
27f30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27f40 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
27f50 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
27f60 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
27f70 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
27f80 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
27f90 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
27fa0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
27fb0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
27fc0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
27fd0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
27fe0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
27ff0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
28000 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
28010 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
28020 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28030 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
28040 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28050 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
28060 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28070 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
28080 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
28090 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
280a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
280b0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
280c0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
280d0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
280e0 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
280f0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
28100 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
28110 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
28120 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
28130 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
28140 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
28150 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
28160 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
28170 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
28180 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
28190 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
281a0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
281b0 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
281c0 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
281d0 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
281e0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
281f0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28200 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
28210 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
28220 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
28230 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
28240 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
28250 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
28260 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
28270 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
28280 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
28290 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
282a0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
282b0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
282c0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
282d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
282e0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
282f0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
28300 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
28310 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
28320 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
28330 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
28340 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
28350 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
28360 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
28370 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
28380 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
28390 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
283a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
283b0 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
283c0 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
283d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
283e0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
283f0 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
28400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
28410 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
28420 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
28430 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
28440 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
28450 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
28460 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
28470 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
28480 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
28490 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
284a0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
284b0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
284c0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
284d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
284e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
284f0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
28500 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
28510 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
28520 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
28530 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
28540 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
28550 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
28560 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
28570 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
28580 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
28590 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
285a0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
285b0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
285c0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
285d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
285e0 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
285f0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
28600 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
28610 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
28620 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
28630 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
28640 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
28650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28660 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
28670 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
28680 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
28690 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
286a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
286b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
286c0 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
286d0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
28700 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
28710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28720 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
28730 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
28740 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
28750 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
28760 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
28770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
28780 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
28790 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
287a0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
287b0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
287c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
287d0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
287e0 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
287f0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
28800 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
28810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
28820 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
28830 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
28840 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
28850 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
28860 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
28870 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
28880 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
28890 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
288a0 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
288b0 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
288c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
288d0 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
288e0 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
288f0 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
28900 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
28910 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
28920 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
28930 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
28940 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
28950 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
28960 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
28970 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
28980 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
28990 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
289a0 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
289b0 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
289c0 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
289d0 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
289e0 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
289f0 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
28a00 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
28a10 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
28a20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
28a30 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
28a40 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
28a50 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
28a60 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
28a70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
28a80 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
28a90 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
28aa0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
28ab0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
28ac0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
28ad0 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
28ae0 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
28af0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
28b00 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
28b10 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
28b20 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
28b30 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
28b40 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
28b50 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
28b60 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
28b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
28b80 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
28b90 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
28ba0 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
28bb0 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
28bc0 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
28bd0 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
28be0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
28bf0 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
28c00 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
28c10 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
28c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28c30 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
28c40 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
28c50 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
28c60 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
28c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
28c80 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
28c90 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
28cc0 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
28cd0 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28cf0 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
28d00 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
28d10 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
28d20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
28d30 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
28d40 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
28d50 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
28d60 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
28d70 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
28d80 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  );.    char *zEq
28d90 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
28da0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
28db0 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
28dc0 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
28dd0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
28de0 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
28df0 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
28e00 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
28e10 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
28e20 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
28e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
28e40 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
28e50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
28e60 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
28e70 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
28e80 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
28e90 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
28ea0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
28eb0 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
28ec0 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
28ed0 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
28ee0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
28ef0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28f00 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
28f10 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
28f20 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
28f30 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72  e returned accor
28f40 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65  ding to the Sele
28f50 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
28f60 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
28f70 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
28f80 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66   for further inf
28f90 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
28fa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
28fb0 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
28fc0 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
28fd0 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
28fe0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
28ff0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
29000 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
29010 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
29020 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
29030 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
29040 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
29050 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
29060 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
29070 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
29080 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
29090 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
290a0 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
290b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
290c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
290d0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
290e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
290f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29100 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
29110 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
29120 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
29130 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20   *pDest      /* 
29140 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
29150 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
29160 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
29170 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
29180 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29190 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
291a0 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
291b0 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
291c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
291d0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291f0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
29200 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
29210 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
29220 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
29230 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
29240 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
29250 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
29260 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
29270 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
29280 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
29290 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
292a0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
292b0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
292c0 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
292d0 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
292e0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
292f0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
29300 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29310 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
29320 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
29330 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
29340 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29350 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
29360 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
29370 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
29380 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
29390 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  L */.  int rc = 
293a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
293b0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
293c0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
293d0 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
293e0 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
293f0 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
29400 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
29410 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
29420 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20   SortCtx sSort; 
29430 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
29440 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
29450 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
29460 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20  se */.  AggInfo 
29470 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f  sAggInfo;      /
29480 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  * Information us
29490 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20  ed by aggregate 
294a0 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74  queries */.  int
294b0 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   iEnd;          
294c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
294d0 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
294e0 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
294f0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
29500 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
29510 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
29520 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
29530 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
29540 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65  int iRestoreSele
29550 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
29560 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72  SelectId;.  pPar
29570 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20  se->iSelectId = 
29580 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
29590 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a  ectId++;.#endif.
295a0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
295b0 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  db;.  if( p==0 |
295c0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
295d0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
295e0 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
295f0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
29600 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
29610 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
29620 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
29630 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
29640 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
29650 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
29660 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  o));.#if SELECTT
29670 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
29680 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
29690 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54  dent++;.  SELECT
296a0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
296b0 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73  , ("begin proces
296c0 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66  sing:\n"));.  if
296d0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
296e0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
296f0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
29700 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
29710 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
29720 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
29730 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
29740 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
29750 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
29760 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
29770 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
29780 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
29790 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
297a0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
297b0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
297c0 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
297d0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
297e0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
297f0 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
29800 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
29810 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
29820 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
29830 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
29840 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
29850 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
29860 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
29870 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
29880 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
29890 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
298a0 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
298b0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
298c0 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
298d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
298e0 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
298f0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
29900 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
29910 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
29920 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
29930 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
29940 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
29950 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
29960 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
29970 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
29980 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
29990 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
299a0 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
299b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
299c0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
299d0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
299e0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
299f0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
29a00 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
29a10 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
29a20 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
29a30 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
29a40 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
29a50 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
29a60 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
29a70 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
29a80 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
29a90 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
29aa0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29ab0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
29ac0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
29ad0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
29ae0 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
29af0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
29b00 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
29b10 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
29b20 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52   );.#if SELECTTR
29b30 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
29b40 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
29b50 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
29b60 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
29b70 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
29b80 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
29b90 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
29ba0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
29bb0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
29bc0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  );.  }.#endif...
29bd0 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
29be0 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
29bf0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
29c00 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
29c10 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
29c20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
29c30 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f  /* If writing to
29c40 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72   memory or gener
29c50 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a  ating a set.  **
29c60 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63   only a single c
29c70 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74  olumn may be out
29c80 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  put..  */.#ifnde
29c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
29ca0 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65  BQUERY.  if( che
29cb0 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
29cc0 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72  SelectError(pPar
29cd0 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73  se, pDest, pELis
29ce0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
29cf0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
29d00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
29d10 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
29d20 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
29d30 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
29d40 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
29d50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
29d60 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
29d70 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
29d80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
29d90 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
29da0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
29db0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
29dc0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
29dd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
29de0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
29df0 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
29e00 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
29e10 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
29e20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
29e30 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
29e40 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f  if( pSub==0 ) co
29e50 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
29e60 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f  Sometimes the co
29e70 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72  de for a subquer
29e80 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  y will be genera
29e90 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ted more than.  
29ea0 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68    ** once, if th
29eb0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61  e subquery is pa
29ec0 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rt of the WHERE 
29ed0 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54  clause in a LEFT
29ee0 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f   JOIN,.    ** fo
29ef0 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74  r example.  In t
29f00 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74  hat case, do not
29f10 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20   regenerate the 
29f20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  code to manifest
29f30 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f  .    ** a view o
29f40 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  r the co-routine
29f50 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
29f60 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74  view.  The first
29f70 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a   instance.    **
29f80 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20   is sufficient, 
29f90 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f  though the subro
29fa0 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73  utine to manifes
29fb0 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20  t the view does 
29fc0 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
29fd0 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e  e invoked again.
29fe0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
29ff0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29  m->addrFillSub )
2a000 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
2a010 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  m->viaCoroutine=
2a020 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2a030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2a040 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2a050 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2a060 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2a070 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2a080 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2a090 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2a0a0 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2a0b0 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2a0c0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2a0d0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2a0e0 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2a0f0 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2a100 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2a110 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2a120 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2a130 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2a140 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2a150 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2a160 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2a170 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2a180 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2a190 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2a1a0 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2a1b0 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2a1c0 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2a1d0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2a1e0 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2a1f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2a200 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2a210 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2a220 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69  eight(p);..    i
2a230 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
2a240 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2a250 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
2a260 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
2a270 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
2a280 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
2a290 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sub) ){.      /*
2a2a0 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
2a2b0 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
2a2c0 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
2a2d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41  */.      if( isA
2a2e0 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  ggSub ){.       
2a2f0 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
2a300 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2a310 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2a320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a330 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
2a340 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
2a350 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2a360 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
2a370 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
2a380 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e  ITE_SubqCoroutin
2a390 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e).    ){.      
2a3a0 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63  /* Implement a c
2a3b0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  o-routine that w
2a3c0 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e  ill return a sin
2a3d0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2a3e0 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2a3f0 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  et on each invoc
2a400 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
2a410 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2a420 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2a430 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
2a440 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2a450 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
2a460 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a480 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
2a490 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
2a4a0 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72  gReturn, 0, addr
2a4b0 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Top);.      Vdbe
2a4c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
2a4d0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2a4e0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49  Name));.      pI
2a4f0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2a500 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20   = addrTop;.    
2a510 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2a520 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2a530 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  RT_Coroutine, pI
2a540 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2a550 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
2a560 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
2a570 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
2a580 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
2a590 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
2a5a0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2a5b0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2a5c0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2a5d0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2a5e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
2a5f0 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  Sub->nSelectRow)
2a600 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
2a610 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
2a620 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2a630 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
2a640 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
2a650 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2a660 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65   OP_EndCoroutine
2a670 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2a680 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
2a690 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2a6a0 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
2a6b0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2a6c0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2a6d0 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
2a6e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2a6f0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2a700 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
2a710 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
2a720 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
2a730 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2a740 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
2a750 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2a760 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
2a770 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
2a780 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
2a790 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
2a7a0 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
2a7b0 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
2a7c0 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
2a7d0 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
2a7e0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
2a7f0 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
2a800 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
2a810 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
2a820 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
2a830 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
2a840 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a850 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a860 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
2a870 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
2a880 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a890 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
2a8a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2a8b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2a8c0 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
2a8d0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
2a8e0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2a8f0 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
2a900 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2a910 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
2a920 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2a930 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
2a940 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
2a950 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
2a960 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
2a970 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
2a980 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
2a990 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
2a9a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2a9b0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
2a9c0 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
2a9d0 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
2a9e0 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
2a9f0 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76  pParse); VdbeCov
2aa00 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
2aa10 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2aa20 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
2aa30 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
2aa40 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2aa50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2aa60 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
2aa70 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2aa80 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2aa90 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2aaa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2aab0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2aac0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2aad0 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
2aae0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2aaf0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2ab00 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2ab10 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2ab20 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2ab30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ab40 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2ab50 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
2ab60 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2ab70 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c  nRowLogEst = sql
2ab80 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d  ite3LogEst(pSub-
2ab90 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
2aba0 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
2abb0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
2abc0 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
2abd0 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
2abe0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2abf0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2ac00 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
2ac10 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
2ac20 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2ac30 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
2ac40 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2ac50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2ac60 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
2ac70 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
2ac80 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2ac90 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2aca0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
2acb0 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45  if( /*pParse->nE
2acc0 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c  rr ||*/ db->mall
2acd0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2ace0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
2acf0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
2ad00 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
2ad10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2ad20 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
2ad30 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2ad40 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  rc;.    if( !Ign
2ad50 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2ad60 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2ad70 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2ad80 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2ad90 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
2ada0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64   p->pEList;.#end
2adb0 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  if.  pWhere = p-
2adc0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
2add0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
2ade0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
2adf0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
2ae00 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
2ae10 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2ae20 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
2ae30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ae40 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
2ae50 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
2ae60 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
2ae70 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
2ae80 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
2ae90 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
2aea0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
2aeb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
2aec0 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  tiSelect(pParse,
2aed0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
2aee0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2aef0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
2af00 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
2af10 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45  ectId);.#if SELE
2af20 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2af30 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2af40 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64  1,pParse,p,("end
2af50 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
2af60 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29   processing\n"))
2af70 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53  ;.    pParse->nS
2af80 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23  electIndent--;.#
2af90 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
2afa0 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
2afb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
2afc0 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
2afd0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
2afe0 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
2aff0 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
2b000 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
2b010 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
2b020 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
2b030 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
2b040 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
2b050 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
2b060 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
2b070 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
2b080 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2b090 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
2b0a0 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
2b0b0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
2b0c0 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
2b0d0 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
2b0e0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
2b0f0 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
2b100 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20  BY xyz ORDER BY 
2b110 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
2b120 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
2b130 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
2b140 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
2b150 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
2b160 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
2b170 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
2b180 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
2b190 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
2b1a0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
2b1b0 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
2b1c0 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
2b1d0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
2b1e0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
2b1f0 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
2b200 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
2b210 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
2b220 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
2b230 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
2b240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
2b250 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
2b260 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
2b270 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
2b280 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
2b290 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2b2a0 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
2b2b0 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  y, p->pEList, -1
2b2c0 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
2b2d0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2b2e0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
2b2f0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
2b300 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2b310 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
2b320 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
2b330 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
2b340 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
2b350 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
2b360 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
2b370 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
2b380 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
2b390 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
2b3a0 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
2b3b0 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
2b3c0 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
2b3d0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
2b3e0 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
2b3f0 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
2b400 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
2b410 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
2b420 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
2b430 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
2b440 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2b450 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
2b460 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
2b470 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
2b480 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
2b490 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
2b4a0 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
2b4b0 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
2b4c0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
2b4d0 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
2b4e0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
2b4f0 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
2b500 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
2b510 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
2b520 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
2b530 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
2b540 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
2b550 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
2b560 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
2b570 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
2b580 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
2b590 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
2b5a0 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
2b5b0 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
2b5c0 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
2b5d0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
2b5e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
2b5f0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
2b600 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2b610 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  st(pParse, sSort
2b620 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45  .pOrderBy, 0, pE
2b630 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2b640 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2b650 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2b660 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
2b670 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
2b680 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b690 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2b6a0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2b6b0 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2b6c0 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
2b6d0 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
2b6e0 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
2b6f0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2b700 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2b710 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
2b720 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
2b730 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
2b740 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
2b750 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
2b760 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
2b770 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
2b780 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
2b790 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
2b7a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
2b7b0 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
2b7c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2b7d0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2b7e0 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
2b7f0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
2b800 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
2b810 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
2b820 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
2b830 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b840 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
2b850 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f  ctRow = LARGEST_
2b860 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65  INT64;.  compute
2b870 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
2b880 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
2b890 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
2b8a0 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64  ==0 && sSort.add
2b8b0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
2b8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2b8d0 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61  GetOp(v, sSort.a
2b8e0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
2b8f0 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
2b900 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74  rOpen;.    sSort
2b910 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
2b920 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
2b930 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2b940 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
2b950 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
2b960 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
2b970 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
2b980 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2b990 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
2b9a0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
2b9b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2b9c0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
2b9d0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
2b9e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2b9f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2ba20 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2ba30 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba50 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
2ba60 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2ba70 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
2ba80 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
2bab0 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
2bac0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2bad0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
2bae0 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
2baf0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
2bb00 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
2bb10 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
2bb20 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2bb30 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2bb40 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
2bb50 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
2bb60 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
2bb70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
2bb80 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
2bb90 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
2bba0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
2bbb0 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
2bbc0 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
2bbd0 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
2bbe0 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a  DISTINCT : 0);..
2bbf0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65      /* Begin the
2bc00 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20   database scan. 
2bc10 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
2bc20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2bc30 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2bc40 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72  st, pWhere, sSor
2bc50 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  t.pOrderBy,.    
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc70 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45             p->pE
2bc80 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73  List, wctrlFlags
2bc90 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57  , 0);.    if( pW
2bca0 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2bcb0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
2bcc0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
2bcd0 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
2bce0 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
2bcf0 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
2bd00 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
2bd10 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
2bd20 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
2bd30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2bd40 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
2bd50 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
2bd60 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
2bd70 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
2bd80 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2bd90 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2bda0 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2bdb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2bdc0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2bdd0 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
2bde0 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
2bdf0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2be00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2be10 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2be20 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2be30 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2be40 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2be50 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2be60 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2be70 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2be80 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2be90 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2bea0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2beb0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2bec0 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2bed0 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2bee0 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2bef0 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2bf00 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2bf10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2bf20 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2bf30 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2bf40 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2bf50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2bf60 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2bf70 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2bf80 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2bf90 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2bfa0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2bfb0 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2bfc0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2bfd0 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2bfe0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2bff0 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c010 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2c020 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c040 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2c050 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2c060 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2c070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2c080 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2c090 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2c0a0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2c0b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2c0c0 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2c0d0 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2c0e0 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2c0f0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2c100 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2c110 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2c120 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2c130 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2c140 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2c150 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2c160 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2c170 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2c180 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2c190 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2c1a0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2c1b0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2c1c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2c1d0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2c1e0 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2c1f0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2c200 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2c210 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2c220 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2c230 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2c240 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2c250 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2c260 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2c270 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2c280 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2c2b0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2c2c0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2c2d0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2c2e0 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2c2f0 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2c300 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2c310 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2c320 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2c330 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2c340 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2c350 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2c360 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2c370 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2c380 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2c390 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2c3a0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2c3b0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2c3c0 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2c3d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2c3e0 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2c3f0 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2c400 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2c410 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2c420 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2c430 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2c440 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2c450 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2c460 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2c470 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2c480 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2c490 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2c4a0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2c4b0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2c4c0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2c4d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2c500 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2c510 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2c520 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2c530 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2c540 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2c550 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2c560 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2c570 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2c580 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2c590 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2c5a0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2c5b0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2c5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2c5d0 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
2c5e0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
2c5f0 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
2c600 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2c610 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2c620 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2c630 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
2c640 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
2c650 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2c660 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
2c670 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
2c680 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
2c690 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ...    /* If the
2c6a0 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
2c6b0 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
2c6c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
2c6d0 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
2c6e0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
2c6f0 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
2c700 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
2c710 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
2c720 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
2c730 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
2c740 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
2c750 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
2c760 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
2c770 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
2c780 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
2c790 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
2c7a0 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
2c7b0 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
2c7c0 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
2c7d0 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
2c7e0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
2c7f0 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
2c800 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
2c810 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
2c820 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
2c830 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
2c840 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
2c850 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
2c860 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
2c870 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
2c880 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
2c890 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
2c8a0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
2c8b0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
2c8c0 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
2c8d0 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
2c8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
2c8f0 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
2c900 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
2c910 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
2c920 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
2c930 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
2c940 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
2c950 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
2c960 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
2c970 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
2c980 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
2c990 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
2c9a0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
2c9b0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
2c9c0 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
2c9d0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
2c9e0 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
2c9f0 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
2ca00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ca10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
2ca20 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
2ca30 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
2ca40 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
2ca50 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
2ca60 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
2ca70 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
2ca80 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
2ca90 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
2caa0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2cab0 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
2cac0 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2cad0 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
2cae0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
2caf0 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
2cb00 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2cb10 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
2cb20 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2cb30 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
2cb40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2cb50 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2cb60 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
2cb70 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2cb80 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2cb90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2cba0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2cbb0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2cbc0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2cbd0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2cbe0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2cbf0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2cc00 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2cc10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2cc20 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2cc30 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2cc40 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2cc50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2cc60 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2cc70 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2cc80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2cc90 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2cca0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2ccb0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2ccc0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2ccd0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2cce0 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2ccf0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2cd00 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2cd10 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2cd20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2cd30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2cd40 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2cd50 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2cd60 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2cd70 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2cd80 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2cd90 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2cda0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2cdb0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2cdc0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2cdd0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2cde0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2cdf0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2ce00 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2ce10 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2ce20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2ce30 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
2ce40 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2ce50 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2ce60 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2ce70 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2ce80 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2ce90 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2cea0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2ceb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2cec0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2ced0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2cee0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2cef0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2cf00 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2cf10 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2cf20 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2cf30 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2cf40 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2cf50 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2cf60 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2cf70 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2cf80 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2cf90 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2cfa0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2cfb0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2cfc0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2cfd0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2cfe0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2cff0 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2d000 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2d010 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2d020 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2d030 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2d040 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2d050 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2d060 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2d070 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2d080 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2d090 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2d0a0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2d0b0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2d0c0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2d0d0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2d0e0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2d0f0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2d100 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2d110 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2d120 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2d130 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2d140 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2d150 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2d160 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2d170 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2d180 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2d190 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2d1a0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2d1b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2d1c0 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49  roupBy, 0, sAggI
2d1d0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  nfo.nColumn);.  
2d1e0 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
2d1f0 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
2d200 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
2d210 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
2d220 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
2d230 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
2d240 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
2d250 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
2d260 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2d270 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
2d280 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
2d290 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ze memory locati
2d2a0 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55  ons used by GROU
2d2b0 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70  P BY aggregate p
2d2c0 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20  rocessing.      
2d2d0 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61  */.      iUseFla
2d2e0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
2d2f0 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74  em;.      iAbort
2d300 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
2d310 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
2d320 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50  OutputRow = ++pP
2d330 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2d340 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2d350 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2d360 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2d370 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50   regReset = ++pP
2d380 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2d390 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71    addrReset = sq
2d3a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2d3b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d  el(v);.      iAM
2d3c0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
2d3d0 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
2d3e0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
2d3f0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2d400 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72      iBMem = pPar
2d410 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
2d420 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2d430 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
2d440 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
2d450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d460 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
2d470 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2d480 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2d490 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66  , "clear abort f
2d4a0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2d4b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2d4c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2d4d0 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
2d4e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d4f0 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63  v, "indicate acc
2d500 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29  umulator empty")
2d510 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d520 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2d530 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c  _Null, 0, iAMem,
2d540 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d   iAMem+pGroupBy-
2d550 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20  >nExpr-1);..    
2d560 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f    /* Begin a loo
2d570 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  p that will extr
2d580 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72  act all source r
2d590 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20  ows in GROUP BY 
2d5a0 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  order..      ** 
2d5b0 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c  This might invol
2d5c0 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  ve two separate 
2d5d0 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50  loops with an OP
2d5e0 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e  _Sort in between
2d5f0 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74  , or.      ** it
2d600 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67   might be a sing
2d610 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65  le loop that use
2d620 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78  s an index to ex
2d630 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  tract informatio
2d640 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68  n.      ** in th
2d650 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f  e right order to
2d660 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20   begin with..   
2d670 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2d680 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d690 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2d6a0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2d6b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  .      pWInfo = 
2d6c0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2d6d0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2d6e0 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  st, pWhere, pGro
2d6f0 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20  upBy, 0,.       
2d700 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59     WHERE_GROUPBY
2d710 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f   | (orderByGrp ?
2d720 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
2d730 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20  UP : 0), 0.     
2d740 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
2d750 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2d760 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
2d770 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2d780 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2d790 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  o)==pGroupBy->nE
2d7a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  xpr ){.        /
2d7b0 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  * The optimizer 
2d7c0 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76  is able to deliv
2d7d0 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70  er rows in group
2d7e0 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20   by order so.   
2d7f0 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f       ** we do no
2d800 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20  t have to sort. 
2d810 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
2d820 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  meral table will
2d830 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63   be.        ** c
2d840 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62  ancelled later b
2d850 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20  ecause we still 
2d860 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  need to use the 
2d870 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20  pKeyInfo.       
2d880 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75   */.        grou
2d890 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20  pBySort = 0;.   
2d8a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d8b0 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f    /* Rows are co
2d8c0 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65  ming out in unde
2d8d0 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20  termined order. 
2d8e0 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68   We have to push
2d8f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68  .        ** each
2d900 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74   row into a sort
2d910 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69  ing index, termi
2d920 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c  nate the first l
2d930 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  oop,.        ** 
2d940 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74  then loop over t
2d950 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
2d960 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
2d970 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
2d980 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64      ** in sorted
2d990 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a   order.        *
2d9a0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  /.        int re
2d9b0 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69  gBase;.        i
2d9c0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20  nt regRecord;.  
2d9d0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a        int nCol;.
2d9e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f          int nGro
2d9f0 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65  upBy;..        e
2da00 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2da10 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2da20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e       (sDistinct.
2da30 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65  isTnct && (p->se
2da40 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e  lFlags&SF_Distin
2da50 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20  ct)==0) ?.      
2da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
2da70 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55  ISTINCT" : "GROU
2da80 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20  P BY");..       
2da90 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31   groupBySort = 1
2daa0 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70  ;.        nGroup
2dab0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By = pGroupBy->n
2dac0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43  Expr;.        nC
2dad0 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20  ol = nGroupBy;. 
2dae0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2daf0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
2db00 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2db10 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2db20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41            if( sA
2db30 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69  ggInfo.aCol[i].i
2db40 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
2db50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
2db60 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Col++;.         
2db70 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
2db80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2db90 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
2dba0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2dbb0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c  nge(pParse, nCol
2dbc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dbd0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2dbe0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2dbf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2dc00 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
2dc10 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
2dc20 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
2dc30 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
2dc40 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2dc50 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
2dc60 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2dc70 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2dc80 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
2dc90 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2dca0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dcb0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2dcc0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2dcd0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
2dce0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
2dcf0 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
2dd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
2dd10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
2dd20 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
2dd30 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd50 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
2dd60 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
2dd70 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
2dd80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2dd90 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ddb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ddc0 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
2ddd0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
2dde0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
2ddf0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2de00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2de10 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
2de20 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2de30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2de40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2de50 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
2de60 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
2de70 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
2de80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2de90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2dea0 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
2deb0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2dec0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2ded0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
2dee0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
2def0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
2df00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2df10 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2df20 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
2df30 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2df40 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2df50 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2df60 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2df70 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
2df80 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
2df90 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
2dfa0 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
2dfb0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2dfc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dfd0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2dfe0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
2dff0 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
2e000 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2e010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e020 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
2e030 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
2e040 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
2e050 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
2e060 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
2e070 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
2e080 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2e090 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2e0a0 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
2e0b0 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
2e0c0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2e0d0 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
2e0e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2e0f0 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
2e100 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
2e110 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
2e120 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
2e130 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
2e140 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
2e150 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
2e160 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
2e170 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
2e180 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
2e190 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
2e1a0 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
2e1b0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
2e1c0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
2e1d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
2e1e0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2e1f0 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
2e200 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
2e210 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
2e220 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
2e230 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
2e240 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2e250 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20 2a  IZER to .      *
2e260 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f  * disable this o
2e270 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
2e280 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
2e290 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
2e2a0 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f 70  orderByGrp && Op
2e2b0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
2e2c0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f  d(db, SQLITE_Gro
2e2d0 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20 20  upByOrder) .    
2e2e0 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53 6f     && (groupBySo
2e2f0 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68 65  rt || sqlite3Whe
2e300 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e 66  reIsSorted(pWInf
2e310 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  o)).      ){.   
2e320 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
2e330 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rBy = 0;.       
2e340 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2e350 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
2e360 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2e370 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2e380 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
2e390 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2e3a0 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
2e3b0 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
2e3c0 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
2e3d0 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
2e3e0 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
2e3f0 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
2e400 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
2e410 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
2e420 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2e430 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
2e440 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
2e450 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
2e460 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
2e470 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
2e480 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
2e490 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
2e4a0 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
2e4b0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2e4c0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2e4d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e4e0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2e4f0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
2e500 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2e510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e520 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
2e530 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
2e540 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
2e550 6f 72 74 4f 75 74 2c 73 6f 72 74 50 54 61 62 29  ortOut,sortPTab)
2e560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e570 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
2e580 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
2e590 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
2e5a0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2e5b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e5c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
2e5d0 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
2e5e0 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
2e5f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e600 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2e610 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2e620 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e630 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2e640 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
2e650 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
2e660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e670 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2e680 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2e690 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
2e6a0 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
2e6b0 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6d0 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
2e6e0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
2e6f0 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
2e700 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
2e710 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2e720 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2e730 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e740 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
2e750 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56  1+1, 0, j1+1); V
2e760 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
2e770 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2e780 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
2e790 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
2e7a0 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
2e7b0 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
2e7c0 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
2e7d0 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
2e7e0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
2e7f0 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
2e800 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
2e810 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
2e820 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
2e830 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
2e840 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
2e850 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
2e860 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
2e870 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
2e880 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
2e890 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
2e8a0 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
2e8b0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
2e8c0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
2e8d0 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
2e8e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2e8f0 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
2e900 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
2e910 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
2e920 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
2e930 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2e940 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
2e950 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
2e960 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
2e970 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
2e980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2e990 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2e9a0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2e9b0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2e9c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e9d0 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
2e9e0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2e9f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ea00 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
2ea10 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
2ea20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2ea30 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2ea40 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
2ea50 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2ea60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ea70 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
2ea80 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
2ea90 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
2eaa0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
2eab0 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
2eac0 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
2ead0 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
2eae0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
2eaf0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
2eb00 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
2eb10 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
2eb20 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
2eb30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2eb40 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
2eb50 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
2eb60 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2eb70 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2eb80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2eb90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2eba0 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  1, iUseFlag);.  
2ebb0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2ebc0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61  (v, "indicate da
2ebd0 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f  ta in accumulato
2ebe0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2ebf0 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  End of the loop.
2ec00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2ec10 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2ec20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2ec30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ec40 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41  P_SorterNext, sA
2ec50 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2ec60 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70  x, addrTopOfLoop
2ec70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
2ec80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2ec90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2eca0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2ecb0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2ecc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2ecd0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
2ece0 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
2ecf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2ed00 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
2ed10 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
2ed20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2ed30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2ed40 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2ed50 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2ed60 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2ed70 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2ed80 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
2ed90 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
2eda0 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
2edb0 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
2edc0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2edd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ede0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
2edf0 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
2ee00 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2ee10 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2ee20 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
2ee30 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2ee40 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
2ee50 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
2ee60 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
2ee70 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
2ee80 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
2ee90 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2eea0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
2eeb0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
2eec0 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
2eed0 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
2eee0 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
2eef0 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
2ef00 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
2ef10 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
2ef20 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
2ef30 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
2ef40 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
2ef50 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
2ef60 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
2ef70 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
2ef80 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
2ef90 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
2efa0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
2efb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2efc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2efd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2efe0 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
2eff0 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2f000 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
2f010 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
2f020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f030 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2f040 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2f050 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
2f060 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2f070 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
2f080 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
2f090 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
2f0a0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2f0b0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2f0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2f0d0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
2f0e0 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
2f0f0 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65 43 6f  utRow+2); VdbeCo
2f100 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2f110 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2f120 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
2f130 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
2f140 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
2f150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f160 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2f170 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
2f180 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
2f190 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
2f1a0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2f1b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f1c0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2f1d0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
2f1e0 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
2f1f0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2f200 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2f210 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2f220 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  ->pEList, -1, &s
2f230 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sort,.          
2f240 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69              &sDi
2f250 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2f260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f270 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2f280 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
2f290 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
2f2a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2f2b0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2f2c0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2f2d0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f2e0 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
2f2f0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
2f300 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2f310 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2f320 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
2f330 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
2f340 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
2f350 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2f360 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2f370 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
2f380 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
2f390 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
2f3a0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2f3b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f3c0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2f3d0 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
2f3e0 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
2f3f0 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67  f pGroupBy.  Beg
2f400 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  in aggregate que
2f410 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f  ries without GRO
2f420 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c  UP BY: */.    el
2f430 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
2f440 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23  ist *pDel = 0;.#
2f450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f460 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
2f470 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2f480 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
2f490 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74   = isSimpleCount
2f4a0 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21  (p, &sAggInfo))!
2f4b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
2f4c0 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e   If isSimpleCoun
2f4d0 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f  t() returns a po
2f4e0 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65  inter to a Table
2f4f0 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
2f500 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f510 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
2f520 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
2f530 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f540 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75   **   SELECT cou
2f550 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
2f560 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2f570 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
2f580 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2f590 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73   returned repres
2f5a0 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e  ents table <tbl>
2f5b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2f5c0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61       ** This sta
2f5d0 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d  tement is so com
2f5e0 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f  mon that it is o
2f5f0 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c  ptimized special
2f600 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ly. The.        
2f610 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74  ** OP_Count inst
2f620 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75  ruction is execu
2f630 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68  ted either on th
2f640 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74  e intkey table t
2f650 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
2f660 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
2f670 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e   for table <tbl>
2f680 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74   or on one of it
2f690 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20  s indexes. It.  
2f6a0 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74        ** is bett
2f6b0 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  er to execute th
2f6c0 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78  e op on an index
2f6d0 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65  , as indexes are
2f6e0 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20   almost.        
2f6f0 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64  ** always spread
2f700 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67   across less pag
2f710 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f  es than their co
2f720 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2f730 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2f740 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
2f750 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2f760 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
2f770 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
2f780 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
2f790 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d  const int iCsr =
2f7a0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2f7b0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
2f7c0 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f  o scan b-tree */
2f7d0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2f7e0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
2f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f800 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2f810 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65  le */.        Ke
2f820 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
2f830 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f840 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
2f850 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20  r scanned index 
2f860 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2f870 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
2f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f890 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f  /* Best index fo
2f8a0 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
2f8b0 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20        int iRoot 
2f8c0 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20  = pTab->tnum;   
2f8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2f8e0 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e  ot page of scann
2f8f0 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  ed b-tree */..  
2f900 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
2f910 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2f920 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
2f930 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
2f940 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
2f950 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
2f960 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
2f970 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2f980 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  h for the index 
2f990 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77  that has the low
2f9a0 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20  est scan cost.. 
2f9b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f9c0 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35    ** (2011-04-15
2f9d0 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75  ) Do not do a fu
2f9e0 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e  ll scan of an un
2f9f0 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20  ordered index.. 
2fa00 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2fa10 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33    ** (2013-10-03
2fa20 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74  ) Do not count t
2fa30 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20  he entries in a 
2fa40 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20  partial index.. 
2fa50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2fa60 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65    ** In practice
2fa70 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
2fa80 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20  ucture will not 
2fa90 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f  be used. It is o
2faa0 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  nly .        ** 
2fab0 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f  passed to keep O
2fac0 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79  P_OpenRead happy
2fad0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2fae0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
2faf0 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74  id(pTab) ) pBest
2fb00 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
2fb10 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
2fb20 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
2fb30 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
2fb40 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
2fb50 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
2fb60 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e     if( pIdx->bUn
2fb70 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2fb80 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73        && pIdx->s
2fb90 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
2fba0 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20  TabRow.         
2fbb0 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74    && pIdx->pPart
2fbc0 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20  IdxWhere==0.    
2fbd0 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73         && (!pBes
2fbe0 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78  t || pIdx->szIdx
2fbf0 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78  Row<pBest->szIdx
2fc00 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29  Row).          )
2fc10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
2fc20 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
2fc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc40 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
2fc50 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
2fc60 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
2fc70 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
2fc80 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
2fc90 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
2fca0 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
2fcb0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2fcc0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
2fcd0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
2fce0 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
2fcf0 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
2fd00 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
2fd10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fd20 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
2fd30 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52  enRead, iCsr, iR
2fd40 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  oot, iDb, 1);.  
2fd50 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
2fd60 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
2fd70 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2fd80 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
2fd90 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
2fda0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2fdb0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2fdc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2fdd0 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
2fde0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
2fdf0 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
2fe00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2fe10 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
2fe20 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
2fe30 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2fe40 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
2fe50 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
2fe60 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
2fe70 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
2fe80 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
2fe90 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2fea0 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
2feb0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
2fec0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
2fed0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2fee0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2fef0 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
2ff00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
2ff10 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
2ff20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
2ff30 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
2ff40 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
2ff50 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
2ff60 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
2ff70 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
2ff80 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
2ff90 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
2ffa0 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
2ffb0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
2ffc0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
2ffd0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
2ffe0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
2fff0 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
30000 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
30010 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
30020 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
30030 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
30040 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
30050 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
30060 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
30070 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
30080 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
30090 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
300a0 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
300b0 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
300c0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
300d0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
300e0 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
300f0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
30100 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
30110 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
30120 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
30130 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
30140 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
30150 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
30160 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
30170 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
30180 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
30190 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
301a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
301b0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
301c0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
301d0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
301e0 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
301f0 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
30200 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
30210 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
30220 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
30230 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
30240 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
30250 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30260 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
30270 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
30280 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
30290 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
302a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
302b0 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
302c0 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
302d0 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
302e0 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
302f0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
30300 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
30310 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
30320 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
30330 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
30340 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
30350 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
30360 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
30370 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
30380 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30390 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
303a0 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
303b0 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
303c0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
303d0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
303e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
303f0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
30400 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
30410 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
30420 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
30430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
30440 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
30450 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
30460 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
30470 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30480 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
30490 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
304a0 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
304b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
304c0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
304d0 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
304e0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
304f0 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
30500 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
30510 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
30520 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
30530 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
30540 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
30550 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
30560 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
30570 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
30580 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
30590 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
305a0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
305b0 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
305c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
305d0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
305e0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
305f0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
30600 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
30610 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
30620 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
30630 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
30640 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
30650 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
30660 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
30670 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
30680 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
30690 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
306a0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
306b0 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
306c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
306d0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
306e0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
306f0 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
30700 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
30710 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
30720 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
30730 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
30740 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
30750 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
30760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30770 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
30780 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
30790 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
307a0 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
307b0 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
307c0 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
307d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
307e0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
307f0 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  fo)>0 ){.       
30800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30810 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
30820 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65   0, sqlite3Where
30830 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
30840 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  o));.          V
30850 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
30860 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a  %s() by index",.
30870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30880 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
30890 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
308a0 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20  max")));.       
308b0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
308c0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
308d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  o);.        fina
308e0 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
308f0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
30900 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  fo);.      }..  
30910 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
30920 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
30930 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
30940 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
30950 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54  , addrEnd, SQLIT
30960 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
30970 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
30980 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
30990 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30  p->pEList, -1, 0
309a0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
309b0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
309c0 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
309d0 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
309e0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
309f0 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
30a00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
30a10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
30a20 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
30a30 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
30a40 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
30a50 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63  ..  if( sDistinc
30a60 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  t.eTnctType==WHE
30a70 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
30a80 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70  DERED ){.    exp
30a90 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
30aa0 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
30ab0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
30ac0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
30ad0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
30ae0 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
30af0 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
30b00 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
30b10 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
30b20 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
30b30 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
30b40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78  rderBy ){.    ex
30b50 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
30b60 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f 42  Parse, sSort.nOB
30b70 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50  Sat>0 ? "RIGHT P
30b80 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22  ART OF ORDER BY"
30b90 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20  :"ORDER BY");.  
30ba0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
30bb0 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73  il(pParse, p, &s
30bc0 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Sort, pEList->nE
30bd0 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
30be0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
30bf0 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
30c00 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
30c10 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
30c20 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
30c30 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
30c40 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
30c50 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
30c60 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
30c70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
30c80 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
30c90 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
30ca0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
30cb0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
30cc0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
30cd0 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
30ce0 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
30cf0 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
30d00 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
30d10 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61  ect_end:.  expla
30d20 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
30d30 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
30d40 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
30d50 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66  );..  /* Identif
30d60 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  y column names i
30d70 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  f results of the
30d80 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62   SELECT are to b
30d90 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20  e output..  */. 
30da0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30db0 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65  OK && pDest->eDe
30dc0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
30dd0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
30de0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
30df0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
30e00 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
30e10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
30e20 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
30e30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
30e40 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
30e50 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
30e60 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c  CE_ENABLED.  SEL
30e70 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
30e80 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73  e,p,("end proces
30e90 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61  sing\n"));.  pPa
30ea0 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
30eb0 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72  nt--;.#endif.  r
30ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
30ed0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
30ee0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
30ef0 6e 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 3b  ntExpr(Expr *p);
30f00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
30f10 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
30f20 69 73 74 20 2a 70 4c 69 73 74 29 3b 0a 76 6f 69  ist *pList);.voi
30f30 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65  d sqlite3PrintSe
30f40 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
30f50 69 6e 74 20 69 6e 64 65 6e 74 29 3b 0a 2f 2a 0a  int indent);./*.
30f60 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
30f70 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73  man-readable des
30f80 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68  cription of a th
30f90 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e  e Select object.
30fa0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30fb0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 54  TreeViewSelect(T
30fc0 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20  reeView *pView, 
30fd0 63 6f 6e 73 74 20 53 65 6c 65 63 74 20 2a 70 2c  const Select *p,
30fe0 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77   u8 moreToFollow
30ff0 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
31000 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74 65    pView = sqlite
31010 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70 56  3TreeViewPush(pV
31020 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f  iew, moreToFollo
31030 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 65  w);.  sqlite3Tre
31040 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
31050 20 22 53 45 4c 45 43 54 25 73 25 73 20 28 30 78   "SELECT%s%s (0x
31060 25 70 29 22 2c 0a 20 20 20 20 28 28 70 2d 3e 73  %p)",.    ((p->s
31070 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
31080 74 69 6e 63 74 29 20 3f 20 22 20 44 49 53 54 49  tinct) ? " DISTI
31090 4e 43 54 22 20 3a 20 22 22 29 2c 0a 20 20 20 20  NCT" : ""),.    
310a0 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ((p->selFlags & 
310b0 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 3f 20  SF_Aggregate) ? 
310c0 22 20 61 67 67 5f 66 6c 61 67 22 20 3a 20 22 22  " agg_flag" : ""
310d0 29 2c 20 70 0a 20 20 29 3b 0a 20 20 69 66 28 20  ), p.  );.  if( 
310e0 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53  p->pSrc && p->pS
310f0 72 63 2d 3e 6e 53 72 63 20 29 20 6e 2b 2b 3b 0a  rc->nSrc ) n++;.
31100 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
31110 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ) n++;.  if( p->
31120 70 47 72 6f 75 70 42 79 20 29 20 6e 2b 2b 3b 0a  pGroupBy ) n++;.
31130 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
31140 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
31150 3e 70 4f 72 64 65 72 42 79 20 29 20 6e 2b 2b 3b  >pOrderBy ) n++;
31160 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
31170 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
31180 3e 70 4f 66 66 73 65 74 20 29 20 6e 2b 2b 3b 0a  >pOffset ) n++;.
31190 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
311a0 29 20 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ) n++;.  sqlite3
311b0 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
311c0 28 70 56 69 65 77 2c 20 70 2d 3e 70 45 4c 69 73  (pView, p->pELis
311d0 74 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 72 65 73  t, (n--)>0, "res
311e0 75 6c 74 2d 73 65 74 22 29 3b 0a 20 20 69 66 28  ult-set");.  if(
311f0 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70   p->pSrc && p->p
31200 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  Src->nSrc ){.   
31210 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 56 69 65   int i;.    pVie
31220 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56  w = sqlite3TreeV
31230 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20 28  iewPush(pView, (
31240 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c  n--)>0);.    sql
31250 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
31260 28 70 56 69 65 77 2c 20 22 46 52 4f 4d 22 29 3b  (pView, "FROM");
31270 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
31280 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
31290 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
312a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
312b0 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
312c0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 53 74  ->a[i];.      St
312d0 72 41 63 63 75 6d 20 78 3b 0a 20 20 20 20 20 20  rAccum x;.      
312e0 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 5d 3b  char zLine[100];
312f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74  .      sqlite3St
31300 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 7a  rAccumInit(&x, z
31310 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
31320 6e 65 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ne), 0);.      s
31330 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
31340 2c 20 30 2c 20 22 7b 25 64 2c 2a 7d 22 2c 20 70  , 0, "{%d,*}", p
31350 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
31360 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
31370 3e 7a 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20  >zDatabase ){.  
31380 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
31390 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25 73  intf(&x, 0, " %s
313a0 2e 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  .%s", pItem->zDa
313b0 74 61 62 61 73 65 2c 20 70 49 74 65 6d 2d 3e 7a  tabase, pItem->z
313c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
313d0 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
313e0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
313f0 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
31400 2c 20 30 2c 20 22 20 25 73 22 2c 20 70 49 74 65  , 0, " %s", pIte
31410 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
31420 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
31430 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
31440 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
31450 74 66 28 26 78 2c 20 30 2c 20 22 20 74 61 62 6e  tf(&x, 0, " tabn
31460 61 6d 65 3d 25 51 22 2c 20 70 49 74 65 6d 2d 3e  ame=%Q", pItem->
31470 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
31480 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31490 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
314a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
314b0 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22  XPrintf(&x, 0, "
314c0 20 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d   (AS %s)", pItem
314d0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20  ->zAlias);.     
314e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
314f0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
31500 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20  T_LEFT ){.      
31510 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
31520 28 26 78 2c 20 30 2c 20 22 20 4c 45 46 54 2d 4a  (&x, 0, " LEFT-J
31530 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OIN");.      }. 
31540 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
31550 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a  ccumFinish(&x);.
31560 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
31570 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
31580 20 7a 4c 69 6e 65 2c 20 69 3c 70 2d 3e 70 53 72   zLine, i<p->pSr
31590 63 2d 3e 6e 53 72 63 2d 31 29 3b 20 0a 20 20 20  c->nSrc-1); .   
315a0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
315b0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
315c0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
315d0 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70 49  Select(pView, pI
315e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  tem->pSelect, 0)
315f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31600 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31610 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 20 20 7d  op(pView);.    }
31620 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31630 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
31640 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
31650 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
31660 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28 70  e3TreeViewItem(p
31670 56 69 65 77 2c 20 22 57 48 45 52 45 22 2c 20 28  View, "WHERE", (
31680 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c  n--)>0);.    sql
31690 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
316a0 28 70 56 69 65 77 2c 20 70 2d 3e 70 57 68 65 72  (pView, p->pWher
316b0 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
316c0 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
316d0 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iew);.  }.  if( 
316e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
316f0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31700 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
31710 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 28  , p->pGroupBy, (
31720 6e 2d 2d 29 3e 30 2c 20 22 47 52 4f 55 50 42 59  n--)>0, "GROUPBY
31730 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
31740 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
31750 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 49  sqlite3TreeViewI
31760 74 65 6d 28 70 56 69 65 77 2c 20 22 48 41 56 49  tem(pView, "HAVI
31770 4e 47 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20  NG", (n--)>0);. 
31780 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31790 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d  ewExpr(pView, p-
317a0 3e 70 48 61 76 69 6e 67 2c 20 30 29 3b 0a 20 20  >pHaving, 0);.  
317b0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
317c0 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
317d0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
317e0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
317f0 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73  3TreeViewExprLis
31800 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 4f 72 64  t(pView, p->pOrd
31810 65 72 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22  erBy, (n--)>0, "
31820 4f 52 44 45 52 42 59 22 29 3b 0a 20 20 7d 0a 20  ORDERBY");.  }. 
31830 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
31840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31850 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
31860 20 22 4c 49 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e   "LIMIT", (n--)>
31870 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
31880 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
31890 77 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 30 29  w, p->pLimit, 0)
318a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
318b0 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
318c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
318d0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  ffset ){.    sql
318e0 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
318f0 28 70 56 69 65 77 2c 20 22 4f 46 46 53 45 54 22  (pView, "OFFSET"
31900 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20  , (n--)>0);.    
31910 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
31920 78 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4f  xpr(pView, p->pO
31930 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 73  ffset, 0);.    s
31940 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
31950 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20  p(pView);.  }.  
31960 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
31970 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
31980 2a 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a  *zOp = "UNION";.
31990 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
319a0 70 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  p ){.      case 
319b0 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 20 20  TK_ALL:         
319c0 7a 4f 70 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c  zOp = "UNION ALL
319d0 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
319e0 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45   case TK_INTERSE
319f0 43 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 4e 54  CT:   zOp = "INT
31a00 45 52 53 45 43 54 22 3b 20 20 62 72 65 61 6b 3b  ERSECT";  break;
31a10 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45  .      case TK_E
31a20 58 43 45 50 54 3a 20 20 20 20 20 20 7a 4f 70 20  XCEPT:      zOp 
31a30 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
31a40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
31a50 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31a60 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4f 70 2c  Item(pView, zOp,
31a70 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73   (n--)>0);.    s
31a80 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
31a90 6c 65 63 74 28 70 56 69 65 77 2c 20 70 2d 3e 70  lect(pView, p->p
31aa0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 73  Prior, 0);.    s
31ab0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
31ac0 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20  p(pView);.  }.  
31ad0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31ae0 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e  op(pView);.}.#en
31af0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
31b00 42 55 47 20 2a 2f 0a                             BUG */.