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

Artifact fdac71edb73206488b44cfc0f78708e83f99f591:


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 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  dr;.    int iLim
4df0: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
4e00: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
4e10: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
4e20: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4e30: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4e40: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
4e50: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
4e60: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 73    }.    addr = s
4e70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e80: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f  (v, OP_IfNotZero
4e90: 2c 20 69 4c 69 6d 69 74 2c 20 30 2c 20 2d 31 29  , iLimit, 0, -1)
4ea0: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
4eb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ec0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c  beAddOp1(v, OP_L
4ed0: 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ast, pSort->iECu
4ee0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4ef0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
4f00: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74  OP_Delete, pSort
4f10: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4f20: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4f30: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
4f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
4f50: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
4f60: 74 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a  t the OFFSET.*/.
4f70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
4f80: 4f 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a  Offset(.  Vdbe *
4f90: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
4fa0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
4fb0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
4fc0: 6e 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20  nt iOffset,     
4fd0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
4fe0: 64 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20  ding the offset 
4ff0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5000: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
5010: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
5020: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
5030: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
5040: 66 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a  f( iOffset>0 ){.
5050: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
5060: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
5070: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5080: 5f 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c  _IfNeg, iOffset,
5090: 20 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76   0, -1); VdbeCov
50a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
50b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
50c0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
50d0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56  Continue);.    V
50e0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
50f0: 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f  skip OFFSET reco
5100: 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  rds"));.    sqli
5110: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5120: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5130: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5140: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
5150: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
5160: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
5170: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
5180: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
5190: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
51a0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
51b0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
51c0: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
51d0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
51e0: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
51f0: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
5200: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
5210: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
5220: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5230: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5240: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5250: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
5260: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
5270: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
5280: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
5290: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
52a0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
52b0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
52c0: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
52d0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
52e0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
52f0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5300: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
5310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5320: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5330: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5340: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5350: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5360: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5370: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5380: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
53a0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
53b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
53c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
53d0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
53e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
53f0: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
5400: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
5410: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5420: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5440: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5450: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5460: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5470: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5480: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5490: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
54a0: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
54b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
54c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
54d0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
54e0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
54f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5500: 2c 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  , r1);.}..#ifnde
5510: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
5520: 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e  BQUERY./*.** Gen
5530: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
5540: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
5550: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
5560: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
5570: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
5580: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
5590: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
55a0: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
55b0: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
55c0: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
55d0: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
55e0: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
55f0: 20 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f   error used to o
5600: 63 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69  ccur.** in multi
5610: 70 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68  ple places.  (Th
5620: 65 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63  e error only occ
5630: 75 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65  urs in one place
5640: 20 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20   now, but we.** 
5650: 72 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f  retain the subro
5660: 75 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a  utine to minimiz
5670: 65 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f  e code disruptio
5680: 6e 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  n.).*/.static in
5690: 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  t checkForMultiC
56a0: 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
56b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
56c0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
56d0: 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20  e context. */.  
56e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
56f0: 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74  t,   /* Destinat
5700: 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65  ion of SELECT re
5710: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sults */.  int n
5720: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
5730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
5740: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ult columns retu
5750: 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a  rned by SELECT *
5760: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74  /.){.  int eDest
5770: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
5780: 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26  .  if( nExpr>1 &
5790: 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  & (eDest==SRT_Me
57a0: 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  m || eDest==SRT_
57b0: 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Set) ){.    sqli
57c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
57d0: 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67  se, "only a sing
57e0: 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65  le result allowe
57f0: 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22  d for ".       "
5800: 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73  a SELECT that is
5810: 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
5820: 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65  ession");.    re
5830: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5840: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5850: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
5860: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5870: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
5880: 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64  de for the insid
5890: 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  e of the inner l
58a0: 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45  oop.** of a SELE
58b0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63  CT..**.** If src
58c0: 54 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c  Tab is negative,
58d0: 20 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74   then the pEList
58e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
58f0: 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e  are evaluated in
5900: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
5910: 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  e data for this 
5920: 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20  row.  If srcTab 
5930: 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f  is.** zero or mo
5940: 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73  re, then data is
5950: 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63   pulled from src
5960: 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69  Tab and pEList i
5970: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
5980: 74 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f  to get number co
5990: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61  lumns and the da
59a0: 74 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20  tatype for each 
59b0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
59c0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e  c void selectInn
59d0: 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20  erLoop(.  Parse 
59e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
59f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5a00: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
5a10: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
5a20: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5a30: 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74  lete select stat
5a40: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
5a50: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
5a60: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
5a70: 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
5a80: 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64   being extracted
5a90: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
5aa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
5ab0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
5ac0: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
5ad0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
5ae0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
5af0: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
5b00: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
5b10: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
5b20: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
5b30: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
5b40: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
5b50: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
5b60: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
5b70: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
5b80: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
5b90: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
5ba0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
5bb0: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
5bc0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
5bd0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
5be0: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
5bf0: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
5c00: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
5c10: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
5c20: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
5c30: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
5c40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5c50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5c60: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
5c70: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5c80: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
5c90: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
5ca0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
5cb0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
5cc0: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
5cd0: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
5ce0: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
5cf0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
5d00: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
5d10: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
5d20: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
5d30: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
5d40: 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72  arm; /* First ar
5d50: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
5d60: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
5d70: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
5d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5d90: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
5da0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
5db0: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20  nPrefixReg = 0; 
5dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5dd0: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
5de0: 74 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52  ters before regR
5df0: 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esult */..  asse
5e00: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
5e10: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
5e20: 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20    hasDistinct = 
5e30: 70 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73  pDistinct ? pDis
5e40: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
5e50: 20 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   : WHERE_DISTINC
5e60: 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53  T_NOOP;.  if( pS
5e70: 6f 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f  ort && pSort->pO
5e80: 72 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72  rderBy==0 ) pSor
5e90: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f  t = 0;.  if( pSo
5ea0: 72 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  rt==0 && !hasDis
5eb0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
5ec0: 65 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d  ert( iContinue!=
5ed0: 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  0 );.    codeOff
5ee0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
5ef0: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  t, iContinue);. 
5f00: 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68   }..  /* Pull th
5f10: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75  e requested colu
5f20: 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73  mns..  */.  nRes
5f30: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
5f40: 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70  >nExpr;..  if( p
5f50: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
5f60: 7b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20  {.    if( pSort 
5f70: 29 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78  ){.      nPrefix
5f80: 52 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  Reg = pSort->pOr
5f90: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
5fa0: 20 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d      if( !(pSort-
5fb0: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
5fc0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
5fd0: 20 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b   ) nPrefixReg++;
5fe0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5ff0: 4d 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65  Mem += nPrefixRe
6000: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65  g;.    }.    pDe
6010: 73 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72  st->iSdst = pPar
6020: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6030: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6040: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65  nResultCol;.  }e
6050: 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69  lse if( pDest->i
6060: 53 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20  Sdst+nResultCol 
6070: 3e 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  > pParse->nMem )
6080: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
6090: 20 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74   an error condit
60a0: 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73  ion that can res
60b0: 75 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ult, for example
60c0: 2c 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a  , when a SELECT.
60d0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69      ** on the ri
60e0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
60f0: 20 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61   an INSERT conta
6100: 69 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20  ins more result 
6110: 63 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20  columns than.   
6120: 20 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f   ** there are co
6130: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
6140: 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20  le on the left. 
6150: 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
6160: 62 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a  be caught.    **
6170: 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
6180: 74 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ter.  But we nee
6190: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65  d to make sure e
61a0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20  nough memory is 
61b0: 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a  allocated.    **
61c0: 20 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20   to avoid other 
61d0: 73 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20  spurious errors 
61e0: 69 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e  in the meantime.
61f0: 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
6200: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
6210: 6f 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d  ol;.  }.  pDest-
6220: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
6230: 43 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74  Col;.  regResult
6240: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
6250: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
6260: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6270: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
6280: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
62a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
62b0: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
62c0: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
62d0: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
62e0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
62f0: 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  me));.    }.  }e
6300: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
6310: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
6320: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
6330: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
6340: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
6350: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
6360: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
6370: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
6380: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
6390: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
63a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
63b0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
63c0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
63d0: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
63e0: 20 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53         (eDest==S
63f0: 52 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74  RT_Output||eDest
6400: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29  ==SRT_Coroutine)
6410: 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50  ?SQLITE_ECEL_DUP
6420: 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  :0);.  }..  /* I
6430: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
6440: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
6450: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
6460: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
6470: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
6480: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
6490: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
64a0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
64b0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
64c0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
64d0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
64e0: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
64f0: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
6500: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
6510: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
6520: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
6530: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
6550: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
6560: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
6570: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
6580: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
6590: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
65a0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
65b0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
65c0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
65d0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
65e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
65f0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
6600: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
6610: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
6620: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
6630: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
6640: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6650: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
6660: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
6670: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
6680: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
6690: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
66a0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
66b0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
66c0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
66d0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
66e0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
66f0: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
6700: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
6710: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
6720: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
6730: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
6740: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
6750: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
6760: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
6770: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
6780: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
6790: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
67a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
67b0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
67c0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
67d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
67e0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
67f0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
6800: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
6810: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
6820: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
6830: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
6840: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
6850: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
6860: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
6870: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6880: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
6890: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
68a0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
68c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
68d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
68e0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
68f0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
6900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6910: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20   i<nResultCol-1 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
6930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6940: 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65  (v, OP_Ne, regRe
6950: 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72  sult+i, iJump, r
6960: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
6970: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
6980: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
6990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
69b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c  AddOp3(v, OP_Eq,
69c0: 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43   regResult+i, iC
69d0: 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76  ontinue, regPrev
69e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
69f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
6a10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6a20: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6a30: 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  -1, (const char 
6a40: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
6a50: 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20  SEQ);.          
6a60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6a70: 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55  eP5(v, SQLITE_NU
6a80: 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d  LLEQ);.        }
6a90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6ab0: 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d  entAddr(v)==iJum
6ac0: 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  p || pParse->db-
6ad0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6af0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6b00: 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74  _Copy, regResult
6b10: 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75  , regPrev, nResu
6b20: 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20  ltCol-1);.      
6b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
6b40: 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  ..      case WHE
6b50: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
6b60: 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  UE: {.        sq
6b70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6b80: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
6b90: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
6ba0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6bb0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66      }..      def
6bc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
6bd0: 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63  assert( pDistinc
6be0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  t->eTnctType==WH
6bf0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
6c00: 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20  RDERED );.      
6c10: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
6c20: 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74  Parse, pDistinct
6c30: 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74  ->tabTnct, iCont
6c40: 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  inue, nResultCol
6c50: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
6c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6c80: 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20  f( pSort==0 ){. 
6c90: 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28       codeOffset(
6ca0: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6cb0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
6cc0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
6cd0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
6ce0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
6cf0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
6d00: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
6d10: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
6d20: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
6d30: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
6d40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6d50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6d60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
6d70: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
6d80: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
6d90: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6da0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6dc0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
6dd0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
6de0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b  nResultCol, r1);
6df0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6e00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6e10: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6e20: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
6e30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6e40: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
6e50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6e60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
6e70: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
6e80: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
6e90: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
6ea0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
6eb0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
6ec0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
6ed0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
6ee0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
6ef0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
6f00: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
6f10: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
6f20: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6f40: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
6f50: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
6f60: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
6f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6f80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6f90: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6fa0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
6fb0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
6fc0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
6fd0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
6fe0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6ff0: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
7000: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
7010: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
7020: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
7030: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
7040: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
7050: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
7060: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
7070: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
7080: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7090: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
70a0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
70b0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
70c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
70d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
70e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
70f0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7100: 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67  l, r1+nPrefixReg
7110: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
7120: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20  E_OMIT_CTE.     
7130: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
7140: 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20  DistFifo ){.    
7150: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
7160: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
7170: 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73  tFifo, then curs
7180: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
7190: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
71a0: 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  on an ephemeral 
71b0: 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75  index. If the cu
71c0: 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72  rrent row is alr
71d0: 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20  eady present.   
71e0: 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69       ** in the i
71f0: 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69  ndex, do not wri
7200: 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74  te it to the out
7210: 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64  put. If not, add
7220: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
7230: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74  current row to t
7240: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f  he index and pro
7250: 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e  ceed with writin
7260: 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20  g it to the.    
7270: 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61      ** output ta
7280: 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f  ble as well.  */
7290: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
72a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
72b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
72c0: 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  4;.        sqlit
72d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
72e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
72f0: 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20  rm+1, addr, r1, 
7300: 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
7310: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
7320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7330: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7340: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
7350: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
7360: 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ort==0 );.      
7370: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
7380: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7390: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
73a0: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
73b0: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
73c0: 65 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  eg, 1, nPrefixRe
73d0: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
73e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
73f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
7400: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
7410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7430: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
7440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7460: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7470: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
7480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7490: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
74a0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
74b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
74c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
74d0: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
74e0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
74f0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
7500: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
7510: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
7520: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
7530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
7540: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
7550: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
7560: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
7570: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
7580: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
7590: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
75a0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
75b0: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
75c0: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
75d0: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
75e0: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
75f0: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
7600: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
7610: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
7620: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7630: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7640: 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
7650: 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  st =.           
7660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7670: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
7680: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
7690: 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
76a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
76b0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  rt ){.        /*
76c0: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
76d0: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
76e0: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
76f0: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
7700: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
7710: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
7720: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
7730: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
7740: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
7750: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
7760: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
7770: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
7780: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
7790: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
77a0: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
77b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
77c0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
77d0: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
77e0: 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66  Result, 1, nPref
77f0: 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65  ixReg);.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7810: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7820: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
7830: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7840: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
7850: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7860: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
7870: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
7880: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7890: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
78a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
78b0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
78c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
78e0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
78f0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
7900: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7910: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
7920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7930: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7940: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
7950: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
7960: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
7970: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
7980: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
7990: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
79a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
79b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
79c0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
79d0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
79e0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
79f0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
7a00: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
7a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
7a30: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
7a40: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
7a50: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
7a60: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
7a70: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
7a80: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
7a90: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
7aa0: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
7ab0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
7ac0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
7ad0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7ae0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7af0: 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31  t( nResultCol==1
7b00: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7b10: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7b20: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7b30: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7b40: 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50  regResult, 1, nP
7b50: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
7b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b70: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
7b80: 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20  t==iParm );.    
7b90: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
7ba0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
7bb0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
7bc0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
7bd0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7be0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
7bf0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
7c00: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
7c10: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
7c20: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
7c30: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
7c40: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
7c50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
7c60: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
7c70: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
7c80: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
7c90: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
7ca0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
7cb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7cc0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7cd0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53   );.      if( pS
7ce0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ort ){.        p
7cf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
7d00: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
7d10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
7d20: 6c 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65  ltCol, nPrefixRe
7d30: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
7d40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
7d50: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
7d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d70: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
7d80: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
7d90: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
7da0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7db0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7dc0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
7dd0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7de0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
7df0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
7e00: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
7e10: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  e, regResult, nR
7e20: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
7e30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7e40: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7e50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
7e60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
7e70: 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70  results into a p
7e80: 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68  riority queue th
7e90: 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f  at is order acco
7ea0: 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  rding to.    ** 
7eb0: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20  pDest->pOrderBy 
7ec0: 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74  (in pSO).  pDest
7ed0: 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50  ->iSDParm (in iP
7ee0: 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73  arm) is the curs
7ef0: 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  or for an.    **
7f00: 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d   index with pSO-
7f10: 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73  >nExpr+2 columns
7f20: 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75  .  Build a key u
7f30: 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65  sing pSO for the
7f40: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53   first.    ** pS
7f50: 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73  O->nExpr columns
7f60: 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
7f70: 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e   all keys are un
7f80: 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61  ique by adding a
7f90: 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50  .    ** final OP
7fa0: 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e  _Sequence column
7fb0: 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75  .  The last colu
7fc0: 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64  mn is the record
7fd0: 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20   as a blob..    
7fe0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
7ff0: 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63  DistQueue:.    c
8000: 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b  ase SRT_Queue: {
8010: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
8020: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
8030: 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74  2, r3;.      int
8040: 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20   addrTest = 0;. 
8050: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
8060: 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20  SO;.      pSO = 
8070: 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pDest->pOrderBy;
8080: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8090: 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79  SO );.      nKey
80a0: 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20   = pSO->nExpr;. 
80b0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
80c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
80d0: 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  se);.      r2 = 
80e0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
80f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79  nge(pParse, nKey
8100: 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  +2);.      r3 = 
8110: 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20  r2+nKey+1;.     
8120: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8130: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8140: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
8150: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
8160: 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75  stQueue, then cu
8170: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
8180: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
8190: 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70  * on a second ep
81a0: 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68  hemeral index th
81b0: 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c  at holds all val
81c0: 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f  ues every previo
81d0: 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  usly.        ** 
81e0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65  added to the que
81f0: 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ue. */.        a
8200: 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65  ddrTest = sqlite
8210: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8220: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
8230: 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  m+1, 0, .       
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8270: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
8280: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
82a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
82b0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
82c0: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
82d0: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a  ResultCol, r3);.
82e0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
82f0: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
8300: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8310: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8320: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
8330: 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20  rm+1, r3);.     
8340: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8350: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8360: 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
8370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
8380: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
8390: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
83a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
83b0: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20  v, OP_SCopy,.   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74         regResult
83e0: 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78   + pSO->a[i].u.x
83f0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
8400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8410: 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69              r2+i
8420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8430: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8440: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
8450: 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65  e, iParm, r2+nKe
8460: 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y);.      sqlite
8470: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8480: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32  P_MakeRecord, r2
8490: 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20  , nKey+2, r1);. 
84a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
84b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
84c0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
84d0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  1);.      if( ad
84e0: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
84f0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8500: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
8510: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
8520: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
8530: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8540: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
8550: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
8560: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
8570: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8580: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8590: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
85a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
85b0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
85c0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
85d0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
85e0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
85f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
8600: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
8610: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
8620: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
8630: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
8640: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
8650: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
8660: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
8670: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
8680: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
8690: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
86a0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
86b0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
86c0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
86d0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
86e0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
86f0: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
8700: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
8710: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
8720: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
8730: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
8740: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
8750: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
8760: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
8770: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
8780: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
8790: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
87a0: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
87b0: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
87c0: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
87d0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
87e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
87f0: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
8800: 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
8810: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
8820: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
8830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8840: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
8850: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
8860: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
8870: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
8880: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
8890: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
88a0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
88b0: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
88c0: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
88d0: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20  .  KeyInfo *p = 
88e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
88f0: 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ero(0, .        
8900: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
8910: 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b  f(KeyInfo) + (N+
8920: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
8930: 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28 20  eq*)+1));.  if( 
8940: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72  p ){.    p->aSor
8950: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
8960: 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20  ->aColl[N+X];.  
8970: 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75    p->nField = (u
8980: 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46  16)N;.    p->nXF
8990: 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20  ield = (u16)X;. 
89a0: 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28     p->enc = ENC(
89b0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d  db);.    p->db =
89c0: 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66   db;.    p->nRef
89d0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
89e0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
89f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  led = 1;.  }.  r
8a00: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8a10: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b  * Deallocate a K
8a20: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
8a30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79  .void sqlite3Key
8a40: 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66  InfoUnref(KeyInf
8a50: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
8a60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
8a70: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
8a80: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
8a90: 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ( p->nRef==0 ) s
8aa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
8ab0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
8ac0: 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e   Make a new poin
8ad0: 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  ter to a KeyInfo
8ae0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e   object.*/.KeyIn
8af0: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
8b00: 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  foRef(KeyInfo *p
8b10: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
8b20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
8b30: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
8b40: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ef++;.  }.  retu
8b50: 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn p;.}..#ifdef 
8b60: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
8b70: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8b80: 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  f a KeyInfo obje
8b90: 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  ct can be change
8ba0: 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f  .  The KeyInfo o
8bb0: 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c  bject.** can onl
8bc0: 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20  y be changed if 
8bd0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73  this is just a s
8be0: 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20  ingle reference 
8bf0: 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a  to the object..*
8c00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8c10: 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69  e is used only i
8c20: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
8c30: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
8c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49  .int sqlite3KeyI
8c50: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b  nfoIsWriteable(K
8c60: 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75  eyInfo *p){ retu
8c70: 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d  rn p->nRef==1; }
8c80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8c90: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
8ca0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
8cb0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
8cc0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
8cd0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
8ce0: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
8cf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
8d00: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
8d10: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
8d20: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
8d30: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
8d40: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
8d50: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
8d60: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
8d70: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
8d80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8d90: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
8da0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
8db0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
8dc0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
8dd0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
8de0: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
8df0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
8e00: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
8e10: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
8e20: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8e30: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8e40: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8e50: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
8e60: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
8e70: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
8e80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
8e90: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
8ea0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
8eb0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
8ec0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
8ed0: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
8ee0: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
8ef0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
8f00: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
8f10: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
8f20: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79  tic KeyInfo *key
8f30: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8f40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8f50: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
8f60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
8f70: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8f80: 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68  ,     /* Form th
8f90: 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  e KeyInfo object
8fa0: 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c   from this ExprL
8fb0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  ist */.  int iSt
8fc0: 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  art,          /*
8fd0: 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73   Begin with this
8fe0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74   column of pList
8ff0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
9000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
9010: 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72  d this many extr
9020: 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65  a columns to the
9030: 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   end */.){.  int
9040: 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66   nExpr;.  KeyInf
9050: 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75  o *pInfo;.  stru
9060: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9070: 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
9080: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9090: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  >db;.  int i;.. 
90a0: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
90b0: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
90c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
90d0: 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69  lloc(db, nExpr-i
90e0: 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29  Start, nExtra+1)
90f0: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
9100: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
9110: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
9120: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
9130: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
9140: 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  t, pItem=pList->
9150: 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70  a+iStart; i<nExp
9160: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9170: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
9180: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
9190: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
91a0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
91b0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
91c0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
91d0: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
91e0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
91f0: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69  pInfo->aColl[i-i
9200: 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  Start] = pColl;.
9210: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
9220: 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74  rtOrder[i-iStart
9230: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
9240: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
9250: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
9260: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9270: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9280: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
9290: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
92a0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
92b0: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
92c0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
92d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
92e0: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
92f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9300: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9310: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9320: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
9330: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
9340: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
9350: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
9360: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
9370: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
9380: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9390: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
93a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
93b0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
93c0: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
93d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
93e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
93f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9400: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
9410: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9420: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9430: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
9440: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
9450: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9460: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9470: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9480: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
9490: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
94a0: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
94b0: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
94c0: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
94d0: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
94e0: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
94f0: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
9500: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
9510: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
9520: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
9530: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
9540: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
9550: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
9560: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9570: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
9580: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
9590: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
95a0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
95b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
95c0: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
95d0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
95e0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
95f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
9600: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
9610: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9620: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
9630: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
9640: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
9650: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9660: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
9670: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
9680: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
9690: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
96a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
96b0: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
96c0: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
96d0: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
96e0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
96f0: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
9700: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
9710: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
9720: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
9730: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
9740: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
9750: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
9760: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
9770: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
9780: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
9790: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
97a0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
97b0: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
97c0: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
97d0: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
97e0: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
97f0: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
9800: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
9810: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
9820: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
9830: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
9840: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
9850: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
9860: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9870: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
9880: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
9890: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
98a0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
98b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
98c0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
98d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
98e0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
98f0: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
9900: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
9910: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
9920: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
9930: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
9940: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
9950: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
9960: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
9970: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
9980: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
9990: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
99a0: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
99b0: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
99c0: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
99d0: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
99e0: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
99f0: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
9a00: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
9a10: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
9a20: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
9a30: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
9a40: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
9a50: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
9a60: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
9a70: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
9a80: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
9a90: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
9aa0: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
9ab0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
9ac0: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
9ad0: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
9ae0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
9af0: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
9b00: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
9b10: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
9b20: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
9b30: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
9b40: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
9b50: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
9b60: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
9b70: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
9b80: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
9b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
9ba0: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
9bb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
9be0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9c10: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
9c20: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
9c30: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c50: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
9c60: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
9c90: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
9ca0: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
9cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9cc0: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
9cd0: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
9ce0: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
9cf0: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
9d00: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
9d10: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
9d20: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
9d30: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9d40: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
9d50: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9d60: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
9d70: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
9d80: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
9d90: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
9da0: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
9db0: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
9dc0: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
9dd0: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
9de0: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
9df0: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
9e00: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
9e10: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
9e20: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
9e30: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
9e40: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
9e50: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
9e60: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
9e70: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
9e80: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
9e90: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
9ea0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
9eb0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
9ec0: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
9ed0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
9ee0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
9ef0: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
9f00: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
9f10: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
9f20: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
9f30: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
9f40: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
9f50: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
9f60: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
9f70: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
9f80: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
9f90: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
9fa0: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
9fb0: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
9fc0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
9fd0: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
9fe0: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
9ff0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
a000: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
a010: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
a020: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a030: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
a040: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
a050: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
a060: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
a070: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
a080: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
a090: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
a0a0: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
a0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
a0c0: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
a0d0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
a0e0: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
a0f0: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
a100: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
a110: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a120: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
a130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a140: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
a150: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
a160: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
a170: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a180: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
a190: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
a1a0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
a1b0: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
a1c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a1d0: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
a1e0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
a1f0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
a200: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
a210: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
a220: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
a230: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
a240: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
a250: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
a260: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
a270: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
a280: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
a290: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
a2a0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
a2b0: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2d0: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
a2e0: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
a2f0: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
a320: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
a330: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
a340: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a370: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
a380: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
a390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
a3a0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a3b0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 73 74 72 75 63  COMMENTS.  struc
a3c0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a3d0: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
a3e0: 69 73 74 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a  ist->a;.#endif..
a3f0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a400: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
a410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a420: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
a430: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
a440: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a450: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
a460: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a470: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 42 72 65  Goto, 0, addrBre
a480: 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ak);.    sqlite3
a490: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
a4a0: 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  (v, pSort->label
a4b0: 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54  BkOut);.  }.  iT
a4c0: 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75  ab = pSort->iECu
a4d0: 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73  rsor;.  if( eDes
a4e0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
a4f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
a500: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 72 65 67  utine ){.    reg
a510: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
a520: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
a530: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
a540: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
a550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
a560: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
a570: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
a580: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
a590: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a5a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 6e 53  (pParse);.    nS
a5b0: 6f 72 74 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d  ortData = 1;.  }
a5c0: 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72  .  nKey = pOrder
a5d0: 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72  By->nExpr - pSor
a5e0: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28  t->nOBSat;.  if(
a5f0: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
a600: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
a610: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e  Sorter ){.    in
a620: 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b  t regSortOut = +
a630: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
a640: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50     iSortTab = pP
a650: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
a660: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
a670: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20  elBkOut ){.     
a680: 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69   addrOnce = sqli
a690: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
a6a0: 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  se); VdbeCoverag
a6b0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
a6c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6d0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
a6e0: 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72 65  do, iSortTab, re
a6f0: 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31  gSortOut, nKey+1
a700: 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20 20 20  +nSortData);.   
a710: 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20   if( addrOnce ) 
a720: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
a730: 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
a740: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
a750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a760: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
a770: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
a780: 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
a790: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
a7a0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
a7b0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
a7c0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
a7d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a7e0: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
a7f0: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
a800: 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20  t, iSortTab);.  
a810: 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65    bSeq = 0;.  }e
a820: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
a830: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
a840: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
a850: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a860: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
a870: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
a880: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
a890: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
a8a0: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
a8b0: 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20   iTab;.    bSeq 
a8c0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 1;.  }.  for(i
a8d0: 3d 30 3b 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b  =0; i<nSortData;
a8e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
a8f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a900: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
a910: 54 61 62 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69  Tab, nKey+bSeq+i
a920: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
a930: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
a940: 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d   "%s", aOutEx[i]
a950: 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b  .zName ? aOutEx[
a960: 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45  i].zName : aOutE
a970: 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20  x[i].zSpan));.  
a980: 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  }.  switch( eDes
a990: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
a9a0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
a9b0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
a9c0: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
a9d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
a9e0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
a9f0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
aa00: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
aa10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
aa30: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
aa40: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
aa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
aa60: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
aa70: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
aa80: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
aa90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
aaa0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
aab0: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
aac0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
aad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
aae0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
aaf0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
ab00: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
ab10: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
ab20: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
ab30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
ab40: 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69  gRow, 1, regRowi
ab50: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
ab60: 20 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73             &pDes
ab70: 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a  t->affSdst, 1);.
ab80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ab90: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
aba0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
abb0: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
abc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
abd0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
abe0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
abf0: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
ac00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ac10: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
ac20: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
ac30: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
ac40: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
ac50: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ac60: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
ac70: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
ac80: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
ac90: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
aca0: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
acb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
acc0: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
acd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
ace0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
acf0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
ad00: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
ad10: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
ad20: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ad30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
ad40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
ad50: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
ad60: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
ad70: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
ad80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad90: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
ada0: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
adb0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
adc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
add0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
ade0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
adf0: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
ae00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ae10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ae30: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
ae40: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
ae50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae60: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ae70: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 73 71 6c  Rowid ){.    sql
ae80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ae90: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
aea0: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  w);.    sqlite3R
aeb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
aec0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
aed0: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
aee0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
aef0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
af00: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
af10: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
af20: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
af30: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
af40: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
af50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
af60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
af70: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
af80: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
af90: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
afa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
afb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
afc0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
afd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
afe0: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
aff0: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
b000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
b010: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
b020: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
b030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b040: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
b050: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
b060: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b070: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
b080: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
b090: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
b0a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
b0b0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
b0c0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
b0d0: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
b0e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
b0f0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
b100: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
b110: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
b120: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
b130: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
b140: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
b150: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
b160: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
b170: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
b180: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
b190: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
b1a0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
b1b0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b1c0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
b1d0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
b1e0: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
b1f0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b200: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
b210: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
b220: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
b230: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
b240: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
b250: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
b260: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
b270: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
b280: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
b290: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
b2a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b2b0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
b2c0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
b2d0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
b2e0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
b2f0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
b300: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
b310: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
b320: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
b330: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
b340: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
b350: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
b360: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
b370: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
b380: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
b390: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
b3a0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
b3b0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
b3c0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
b3d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b3e0: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
b3f0: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
b400: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
b410: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
b420: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
b430: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
b440: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
b450: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
b460: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
b470: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b480: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
b490: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
b4a0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
b4b0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
b4c0: 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73  E,F).static cons
b4d0: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
b4e0: 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f  peImpl(.  NameCo
b4f0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
b500: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f  xpr *pExpr,.  co
b510: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b520: 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  gDb,.  const cha
b530: 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20  r **pzOrigTab,. 
b540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b550: 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70  OrigCol,.  u8 *p
b560: 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68  EstWidth.){.  ch
b570: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
b580: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
b590: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
b5a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
b5b0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
b5c0: 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69  else /* if !defi
b5d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b5e0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b5f0: 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63  A) */.# define c
b600: 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c  olumnType(A,B,C,
b610: 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70  D,E,F) columnTyp
b620: 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61  eImpl(A,B,F).sta
b630: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b640: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
b650: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b660: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
b670: 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  pr,.  u8 *pEstWi
b680: 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a  dth.){.#endif /*
b690: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b6a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b6b0: 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68  ETADATA) */.  ch
b6c0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
b6d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
b6e0: 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b  u8 estWidth = 1;
b6f0: 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45  ..  if( NEVER(pE
b700: 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e  xpr==0) || pNC->
b710: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
b720: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
b730: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
b740: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
b750: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
b760: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
b770: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b780: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
b790: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
b7a0: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
b7b0: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
b7c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
b7d0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
b7e0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
b7f0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
b800: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
b810: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
b820: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
b830: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
b840: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b850: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
b860: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
b870: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
b880: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
b890: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b8a0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
b8b0: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
b8c0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
b8d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
b8e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
b8f0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
b900: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
b910: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b920: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
b930: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
b940: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b950: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
b960: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
b970: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
b980: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
b990: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
b9a0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
b9b0: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
b9c0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
b9d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
b9e0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
b9f0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
ba00: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
ba10: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
ba20: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
ba30: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
ba40: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
ba50: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
ba60: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
ba70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
ba80: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
ba90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
baa0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
bab0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
bac0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
bad0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
bae0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
baf0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
bb00: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
bb10: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
bb20: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
bb30: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
bb40: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
bb50: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
bb60: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
bb70: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
bb80: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
bb90: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
bba0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
bbb0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
bbc0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
bbd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
bbe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
bbf0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
bc00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
bc10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
bc20: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
bc30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
bc40: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
bc50: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
bc60: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
bc70: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
bc80: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
bc90: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
bca0: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
bcb0: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
bcc0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
bcd0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
bce0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
bcf0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
bd00: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
bd10: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
bd20: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
bd30: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bd40: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
bd50: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
bd60: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
bd70: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
bd80: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
bd90: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
bda0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bdb0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bdc0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
bdd0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
bde0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
bdf0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
be00: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
be10: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
be20: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
be30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
be40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
be50: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
be60: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
be70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
be80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
be90: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
bea0: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
beb0: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
bec0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
bed0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
bee0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
bef0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
bf00: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bf10: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
bf20: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
bf30: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
bf40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
bf50: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
bf60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
bf70: 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53  Col>=0 && ALWAYS
bf80: 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74  (iCol<pS->pEList
bf90: 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
bfa0: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
bfb0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
bfc0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
bfd0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
bfe0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
bff0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
c000: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
c010: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
c020: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
c030: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
c040: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
c050: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
c060: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
c070: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
c080: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
c090: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
c0a0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
c0b0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
c0c0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
c0d0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
c0e0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
c0f0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
c100: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
c110: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c120: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
c130: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
c140: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
c150: 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67  ,&zOrigDb,&zOrig
c160: 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  Tab,&zOrigCol, &
c170: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
c180: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c190: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
c1a0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
c1b0: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
c1c0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
c1d0: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
c1e0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
c1f0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
c200: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c210: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
c220: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
c230: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69  Tab->nCol) );.#i
c240: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c250: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c260: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
c270: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
c280: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
c290: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
c2a0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
c2b0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
c2c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
c2d0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
c2e0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
c2f0: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
c300: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c310: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
c320: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
c330: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c340: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
c350: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
c360: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
c370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
c380: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
c390: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
c3a0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
c3b0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
c3c0: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
c3d0: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
c3e0: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
c3f0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
c400: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
c410: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
c420: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
c430: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
c440: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
c450: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c460: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
c470: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c480: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
c490: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
c4a0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
c4b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  st;.        }.#e
c4c0: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
c4d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c4e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c4f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
c500: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
c510: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c520: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c530: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
c540: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
c550: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
c560: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
c570: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
c580: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
c590: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
c5a0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
c5b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
c5c0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
c5d0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
c5e0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
c5f0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
c600: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
c610: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
c620: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
c630: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
c640: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
c650: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
c660: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
c670: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
c680: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
c690: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
c6a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
c6b0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
c6c0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
c6d0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
c6e0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
c6f0: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
c700: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
c710: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c720: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c730: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c740: 54 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70  TADATA  .  if( p
c750: 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61  zOrigDb ){.    a
c760: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62  ssert( pzOrigTab
c770: 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b   && pzOrigCol );
c780: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d  .    *pzOrigDb =
c790: 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70   zOrigDb;.    *p
c7a0: 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67  zOrigTab = zOrig
c7b0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
c7c0: 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a  Col = zOrigCol;.
c7d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
c7e0: 20 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45   pEstWidth ) *pE
c7f0: 73 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64  stWidth = estWid
c800: 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79  th;.  return zTy
c810: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
c820: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
c830: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
c840: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
c850: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
c860: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
c870: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
c880: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
c890: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
c8a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c8b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
c8c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
c8d0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
c8e0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
c8f0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
c900: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
c910: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
c920: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
c930: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
c940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
c950: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
c960: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
c970: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
c980: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
c990: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
c9a0: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
c9b0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
c9c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c9d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c9e0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
c9f0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
ca00: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ca10: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
ca20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ca30: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
ca40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
ca50: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
ca60: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
ca70: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
ca80: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
ca90: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
caa0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
cab0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
cac0: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
cad0: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
cae0: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
caf0: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
cb00: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
cb10: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
cb20: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
cb30: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
cb40: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
cb50: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
cb60: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
cb70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
cb80: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
cb90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
cba0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
cbb0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
cbc0: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
cbd0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
cbe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cbf0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cc00: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
cc10: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
cc20: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cc30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cc40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cc50: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
cc60: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
cc70: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
cc80: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
cc90: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
cca0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
ccb0: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
ccc0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
ccd0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
cce0: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
ccf0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
cd00: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
cd10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
cd20: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
cd30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
cd40: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
cd50: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
cd60: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
cd70: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
cd80: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
cd90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
cda0: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
cdb0: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
cdc0: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
cdd0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
cde0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
cdf0: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
ce00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
ce10: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
ce20: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
ce30: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
ce40: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
ce50: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
ce60: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
ce70: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
ce80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
ce90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
cea0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
ceb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
cec0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ced0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
cee0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
cef0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
cf00: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
cf10: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
cf20: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
cf30: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
cf40: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
cf50: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
cf60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
cf70: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
cf80: 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52  amesSet || NEVER
cf90: 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  (v==0) || db->ma
cfa0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
cfb0: 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  urn;.  pParse->c
cfc0: 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
cfd0: 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64    fullNames = (d
cfe0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
cff0: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
d000: 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73  =0;.  shortNames
d010: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
d020: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
d030: 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69  ames)!=0;.  sqli
d040: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d050: 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  s(v, pEList->nEx
d060: 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pr);.  for(i=0; 
d070: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
d080: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
d090: 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69  *p;.    p = pELi
d0a0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
d0b0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d      if( NEVER(p=
d0c0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
d0d0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
d0e0: 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20  a[i].zName ){.  
d0f0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
d100: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
d110: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Name;.      sqli
d120: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d130: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d140: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
d150: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
d170: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
d180: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  || p->op==TK_AGG
d190: 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62  _COLUMN) && pTab
d1a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
d1b0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
d1c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
d1d0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
d1e0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
d1f0: 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28  for(j=0; ALWAYS(
d200: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
d210: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); j++){.       
d220: 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61   if( pTabList->a
d230: 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e  [j].iCursor==p->
d240: 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a  iTable ) break;.
d250: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
d260: 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74  sert( j<pTabList
d270: 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ->nSrc );.      
d280: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
d290: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
d2a0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
d2b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
d2c0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
d2d0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
d2e0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
d2f0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
d300: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
d310: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
d320: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
d330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
d340: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
d350: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
d360: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
d370: 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66  shortNames && !f
d380: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
d390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d3a0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d3b0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20  COLNAME_NAME, . 
d3c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d3d0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
d3e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
d3f0: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
d400: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
d410: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29   if( fullNames )
d420: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
d430: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
d440: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
d450: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
d460: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
d470: 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  me, zCol);.     
d480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d490: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d4a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
d4b0: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
d4c0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
d4d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
d4e0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d4f0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
d500: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
d510: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d520: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d530: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
d540: 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *z = pEList->a[
d550: 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
d560: 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74  z = z==0 ? sqlit
d570: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63  e3MPrintf(db, "c
d580: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a  olumn%d", i+1) :
d590: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
d5a0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  (db, z);.      s
d5b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d5c0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d5d0: 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49  ME_NAME, z, SQLI
d5e0: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
d5f0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
d600: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
d610: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
d620: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EList);.}../*.**
d630: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
d640: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
d650: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
d660: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d670: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
d680: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
d690: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
d6a0: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
d6b0: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
d6c0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
d6d0: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
d6e0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
d6f0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
d700: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
d710: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
d720: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
d730: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
d740: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
d750: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
d760: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
d770: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
d780: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
d790: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
d7a0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d7b0: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
d7c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
d7d0: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
d7e0: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
d7f0: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
d800: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
d810: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
d820: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
d830: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
d840: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d850: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
d860: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d870: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
d880: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
d890: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
d8a0: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
d8b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
d8c0: 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20  /.  i16 *pnCol, 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d8e0: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
d8f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
d900: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
d910: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
d920: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
d930: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
d940: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d950: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d960: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d970: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
d980: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d9a0: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
d9b0: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9d0: 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20 6d  Index added to m
d9e0: 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e 69  ake the name uni
d9f0: 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  que */.  Column 
da00: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20  *aCol, *pCol;   
da10: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
da20: 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74 20  ing over result 
da30: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74  columns */.  int
da40: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
da50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
da60: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
da70: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
da80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20 20  */.  Expr *p;   
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66   /* Expression f
dab0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75  or a single resu
dac0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
dad0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
daf0: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
db00: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
db10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
db20: 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
db30: 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20  ame[] */..  if( 
db40: 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
db50: 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
db60: 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
db70: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
db80: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
db90: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
dbb0: 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
dbc0: 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20      nCol = 0;.  
dbd0: 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a    aCol = 0;.  }.
dbe0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
dbf0: 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
dc00: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
dc10: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
dc20: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
dc30: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
dc40: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
dc50: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
dc60: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   */.    p = sqli
dc70: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
dc80: 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  te(pEList->a[i].
dc90: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
dca0: 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  (zName = pEList-
dcb0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20  >a[i].zName)!=0 
dcc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
dcd0: 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  he column contai
dce0: 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e  ns an "AS <name>
dcf0: 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e  " phrase, use <n
dd00: 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65  ame> as the name
dd10: 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   */.      zName 
dd20: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
dd30: 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
dd40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
dd50: 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20  xpr *pColExpr = 
dd60: 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65  p;  /* The expre
dd70: 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74 68  ssion that is th
dd80: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
dd90: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54 61  name */.      Ta
dda0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
ddb0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f     /* Table asso
ddc0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
ddd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
dde0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
ddf0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
de10: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
de20: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
de30: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
de40: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
de50: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45 78        if( pColEx
de60: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
de70: 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f 6c  N && ALWAYS(pCol
de80: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20 29  Expr->pTab!=0) )
de90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  {.        /* For
dea0: 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65   columns use the
deb0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d   column name nam
dec0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
ded0: 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72   iCol = pColExpr
dee0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
def0: 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78     pTab = pColEx
df00: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
df10: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
df20: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
df30: 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  y;.        zName
df40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
df50: 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20 20  f(db, "%s",.    
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
df70: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
df80: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
df90: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
dfa0: 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78  }else if( pColEx
dfb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pr->op==TK_ID ){
dfc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dfd0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
dfe0: 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49  y(pColExpr, EP_I
dff0: 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
e000: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e010: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e020: 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75  %s", pColExpr->u
e030: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
e040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
e050: 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e  * Use the origin
e060: 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  al text of the c
e070: 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e  olumn expression
e080: 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   as its name */.
e090: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
e0a0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
e0b0: 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d  b, "%s", pEList-
e0c0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20  >a[i].zSpan);.  
e0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e0e0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
e0f0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
e100: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e110: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
e120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
e130: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e140: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
e150: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
e160: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
e170: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
e180: 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20  d an integer to 
e190: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
e1a0: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
e1b0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
e1c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
e1d0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
e1e0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
e1f0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
e200: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e210: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
e220: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
e230: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e240: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
e250: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
e260: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
e270: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
e280: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
e290: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
e2a0: 28 20 6b 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b  ( k>=0 && zName[
e2b0: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
e2c0: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
e2d0: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
e2e0: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
e2f0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
e300: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
e310: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e330: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
e340: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
e350: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
e360: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
e370: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
e380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e390: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
e3a0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
e3b0: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
e3c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e3d0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
e3e0: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
e3f0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
e400: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
e410: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e420: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
e430: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
e440: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
e450: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e460: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e480: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
e490: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
e4a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
e4b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
e4c0: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
e4d0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
e4e0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
e4f0: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
e500: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
e510: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
e520: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
e530: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
e540: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
e550: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
e560: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
e570: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
e580: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
e590: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
e5a0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
e5b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
e5c0: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
e5d0: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
e5e0: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
e5f0: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
e600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
e610: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
e620: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
e630: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e640: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e650: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
e660: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
e670: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
e680: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
e690: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
e6a0: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
e6b0: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
e6c0: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
e6d0: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
e6e0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
e6f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e700: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e710: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
e720: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
e730: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
e740: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
e750: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
e760: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
e770: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
e780: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
e790: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
e7a0: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
e7b0: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
e7c0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
e7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
e7e0: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
e7f0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
e800: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e810: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
e820: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e830: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
e840: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
e850: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
e860: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
e870: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
e880: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
e890: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
e8a0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
e8b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
e8c0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
e8d0: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
e8e0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
e8f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e900: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
e910: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
e920: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
e930: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
e940: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
e950: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
e960: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
e970: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
e980: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
e990: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
e9a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
e9b0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
e9c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e9d0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
e9e0: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
e9f0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
ea00: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
ea10: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
ea20: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
ea30: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
ea40: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ea50: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
ea60: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
ea70: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
ea80: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
ea90: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
eaa0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
eab0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
eac0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
ead0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
eae0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
eaf0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
eb00: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
eb10: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
eb20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
eb30: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
eb40: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
eb50: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
eb60: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
eb70: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
eb80: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
eb90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
eba0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
ebb0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
ebc0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
ebd0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
ebe0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ebf0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
ec00: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
ec10: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
ec20: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
ec30: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
ec40: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
ec50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ec60: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
ec70: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
ec80: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
ec90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
eca0: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
ecb0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
ecc0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
ecd0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
ece0: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
ecf0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
ed00: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
ed10: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
ed20: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
ed30: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
ed40: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ed50: 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
ed60: 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
ed70: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
ed80: 38 35 37 36 29 20 29 3b 0a 20 20 73 65 6c 65 63  8576) );.  selec
ed90: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
eda0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
edb0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
edc0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
edd0: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
ede0: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
edf0: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
ee00: 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74  e, pTab, pSelect
ee10: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
ee20: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
ee30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ee40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
ee50: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  teTable(db, pTab
ee60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
ee70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
ee80: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
ee90: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
eea0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
eeb0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
eec0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
eed0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
eee0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
eef0: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
ef00: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
ef10: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
ef20: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
ef30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
ef40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ef50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
ef60: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
ef70: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
ef80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
ef90: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  te(pParse);.    
efa0: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
efb0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
efc0: 49 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Init);.    if( p
efd0: 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
efe0: 3d 3d 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69  ==0.     && Opti
eff0: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
f000: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
f010: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
f020: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
f030: 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
f040: 63 74 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ctor = 1;.    }.
f050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
f060: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
f070: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
f080: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
f090: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
f0a0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
f0b0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
f0c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
f0d0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
f0e0: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
f0f0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
f100: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
f110: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
f120: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
f130: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
f140: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
f150: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
f160: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
f170: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
f180: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
f190: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
f1a0: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
f1b0: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
f1c0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
f1d0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
f1e0: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
f1f0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
f200: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
f210: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
f220: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
f230: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
f240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
f250: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
f260: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
f270: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
f280: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
f290: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
f2a0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
f2b0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
f2c0: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
f2d0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
f2e0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
f2f0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
f300: 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
f310: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
f320: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
f330: 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
f340: 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
f350: 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
f360: 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
f370: 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
f380: 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
f390: 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
f3a0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
f3b0: 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
f3c0: 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
f3d0: 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
f3e0: 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
f3f0: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
f400: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
f410: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
f420: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
f430: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
f440: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
f450: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
f460: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
f470: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
f480: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
f490: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
f4a0: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
f4b0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
f4c0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
f4d0: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
f4e0: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
f4f0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f500: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
f510: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
f520: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
f530: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
f540: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
f550: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
f560: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
f570: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
f580: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
f590: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
f5a0: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
f5b0: 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77  troversy about w
f5c0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
f5d0: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
f5e0: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
f5f0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
f600: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
f610: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
f620: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
f630: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
f640: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
f650: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
f660: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
f670: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
f680: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
f690: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
f6a0: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
f6b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
f6c0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f6d0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f6e0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
f6f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
f700: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
f710: 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20  pLimit, &n) ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f740: 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29  eger, n, iLimit)
f750: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f760: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f770: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f780: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
f790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
f7b0: 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20  o, 0, iBreak);. 
f7c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
f7d0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
f7e0: 74 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20  tRow>(u64)n ){. 
f7f0: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
f800: 74 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20  tRow = n;.      
f810: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f820: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f830: 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c  de(pParse, p->pL
f840: 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  imit, iLimit);. 
f850: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f860: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
f870: 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b  tBeInt, iLimit);
f880: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f890: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
f8a0: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63  ent((v, "LIMIT c
f8b0: 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20  ounter"));.     
f8c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8d0: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
f8e0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
f8f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f910: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
f920: 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
f930: 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61   iOffset = ++pPa
f940: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
f950: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
f960: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
f970: 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  n extra register
f980: 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65   for limit+offse
f990: 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  t */.      sqlit
f9a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
f9b0: 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69  e, p->pOffset, i
f9c0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
f9d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f9e0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f9f0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
fa00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fa10: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
fa20: 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
fa30: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  er"));.      add
fa40: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
fa50: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
fa60: 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  os, iOffset); Vd
fa70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
fa80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fa90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
faa0: 65 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74  eger, 0, iOffset
fab0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fac0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fad0: 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71  addr1);.      sq
fae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
faf0: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
fb00: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
fb10: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
fb20: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
fb30: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
fb40: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
fb50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fb60: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
fb70: 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  mit); VdbeCovera
fb80: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fb90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fba0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31  , OP_Integer, -1
fbb0: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
fbc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
fbd0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
fbe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
fbf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fc00: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
fc10: 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
fc20: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
fc30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
fc40: 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
fc50: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
fc60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
fc70: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
fc80: 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
fc90: 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
fca0: 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
fcb0: 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
fcc0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
fcd0: 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
fce0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
fcf0: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
fd00: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
fd10: 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
fd20: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
fd30: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
fd40: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
fd50: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
fd60: 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
fd70: 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
fd80: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
fd90: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
fda0: 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
fdb0: 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
fdc0: 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
fdd0: 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
fde0: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
fdf0: 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
fe00: 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
fe10: 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
fe20: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
fe30: 30 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d  0 );.  if( pRet=
fe40: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45  =0 && iCol<p->pE
fe50: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
fe60: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
fe70: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
fe80: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
fe90: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
fea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
feb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
fec0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
fed0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
fee0: 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
fef0: 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
ff00: 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20  LECT.** with an 
ff10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
ff20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
ff30: 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74  llocates and ret
ff40: 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a  urns a KeyInfo.*
ff50: 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74  * structure suit
ff60: 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65  able for impleme
ff70: 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  nting the ORDER 
ff80: 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  BY..**.** Space 
ff90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
ffa0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
ffb0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
ffc0: 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69  alloc. The calli
ffd0: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  ng.** function i
ffe0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
fff0: 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20  r ensuring that 
10000 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
10010 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
10020 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
10030 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53   KeyInfo *multiS
10040 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
10050 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
10060 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
10070 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70  t nExtra){.  Exp
10080 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
10090 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
100a0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20   int nOrderBy = 
100b0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
100c0 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr;.  sqlite3 *d
100d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
100e0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20    KeyInfo *pRet 
100f0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
10100 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72  Alloc(db, nOrder
10110 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20  By+nExtra, 1);. 
10120 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
10130 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
10140 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  i=0; i<nOrderBy;
10150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
10160 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
10170 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64  m *pItem = &pOrd
10180 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  erBy->a[i];.    
10190 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20    Expr *pTerm = 
101a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
101b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
101c0 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ll;..      if( p
101d0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50  Term->flags & EP
101e0 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  _Collate ){.    
101f0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
10200 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
10210 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20  Parse, pTerm);. 
10220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10230 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
10240 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
10250 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d  Parse, p, pItem-
10260 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
10270 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1);.        if(
10280 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
10290 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
102a0 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  l;.        pOrde
102b0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  rBy->a[i].pExpr 
102c0 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  =.          sqli
102d0 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
102e0 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20  eString(pParse, 
102f0 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  pTerm, pColl->zN
10300 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
10310 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10320 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
10330 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20  eable(pRet) );. 
10340 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c       pRet->aColl
10350 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
10360 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72     pRet->aSortOr
10370 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
10380 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
10390 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
103a0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
103b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
103c0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68  MIT_CTE./*.** Th
103d0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
103e0 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74  ates VDBE code t
103f0 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
10400 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20  ntent of a WITH 
10410 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65  RECURSIVE.** que
10420 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ry of the form:.
10430 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69  **.**   <recursi
10440 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73  ve-table> AS (<s
10450 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f  etup-query> UNIO
10460 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69  N [ALL] <recursi
10470 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20  ve-query>).**   
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
104a0 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  __/             
104b0 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
104c0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
104e0 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20  ->pPrior        
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a                p.
10500 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  **.**.** There i
10510 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65  s exactly one re
10520 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72  ference to the r
10530 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69  ecursive-table i
10540 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
10550 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76  e.** of recursiv
10560 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20  e-query, marked 
10570 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74  with the SrcList
10580 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76  ->a[].isRecursiv
10590 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
105a0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
105b0 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
105c0 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
105d0 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
105e0 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
105f0 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
10600 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
10610 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
10620 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
10630 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
10640 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
10650 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
10660 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
10670 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
10680 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
10690 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
106a0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
106b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
106c0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
106d0 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
106e0 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
106f0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
10700 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
10710 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
10720 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
10730 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
10740 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
10750 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
10760 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
10770 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
10780 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
10790 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
107a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
107b0 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
107c0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
107d0 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
107e0 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
107f0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
10800 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
10810 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
10820 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
10830 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
10840 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
10850 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
10860 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
10870 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
10880 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
10890 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
108a0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
108b0 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
108c0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
108d0 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
108e0 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
108f0 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
10900 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
10910 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
10920 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
10930 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
10940 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
10950 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
10960 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
10970 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
10980 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
10990 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
109a0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
109b0 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
109c0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
109d0 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
109e0 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
109f0 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
10a00 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
10a10 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
10a20 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
10a30 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
10a40 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
10a50 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
10a60 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
10a70 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
10a80 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
10a90 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
10aa0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
10ab0 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
10ac0 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
10ad0 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
10ae0 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
10af0 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
10b00 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
10b10 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
10b20 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
10b30 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
10b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
10b50 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
10b60 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
10b70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10b80 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10b90 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10ba0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10bb0 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
10bc0 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
10bd0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10be0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10bf0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10c00 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10c10 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
10c20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
10c30 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
10c40 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
10c50 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
10c60 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
10c70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
10c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10c90 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
10ca0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
10cb0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10cc0 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
10cd0 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
10ce0 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
10cf0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
10d00 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
10d10 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
10d20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
10d30 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
10d40 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
10d50 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
10d60 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
10d70 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
10d80 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
10d90 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
10da0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
10db0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
10dc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10dd0 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
10de0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
10df0 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
10e00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
10e10 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
10e20 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
10e30 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e50 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
10e60 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
10e70 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
10e80 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
10e90 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
10ea0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
10eb0 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
10ec0 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
10ed0 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
10ee0 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
10ef0 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
10f00 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
10f10 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
10f20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
10f30 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10f60 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
10f90 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
10fa0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
10fb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
10fc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
10fd0 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
10fe0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20  , *pOffset;     
10ff0 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
11000 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
11010 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
11020 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
11030 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
11040 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
11050 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
11060 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
11070 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
11080 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
11090 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
110a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
110b0 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
110c0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
110d0 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
110e0 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
110f0 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
11100 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
11110 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
11120 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
11130 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
11140 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
11150 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65  arse, p, addrBre
11160 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20  ak);.  pLimit = 
11170 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66  p->pLimit;.  pOf
11180 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
11190 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20  t;.  regLimit = 
111a0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67  p->iLimit;.  reg
111b0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
111c0 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  set;.  p->pLimit
111d0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20   = p->pOffset = 
111e0 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  0;.  p->iLimit =
111f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
11200 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11210 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a  >pOrderBy;..  /*
11220 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73   Locate the curs
11230 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
11240 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
11250 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57  /.  for(i=0; ALW
11260 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63  AYS(i<pSrc->nSrc
11270 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11280 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65   pSrc->a[i].isRe
11290 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
112a0 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63   iCurrent = pSrc
112b0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
112c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
112d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
112e0 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75  ocate cursors nu
112f0 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20  mbers for Queue 
11300 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54  and Distinct.  T
11310 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
11320 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69   for.  ** the Di
11330 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73  stinct table mus
11340 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  t be exactly one
11350 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75   greater than Qu
11360 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a  eue in order.  *
11370 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69  * for the SRT_Di
11380 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44  stFifo and SRT_D
11390 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61  istQueue destina
113a0 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a  tions to work. *
113b0 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61  /.  iQueue = pPa
113c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
113d0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
113e0 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20  ON ){.    eDest 
113f0 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
11400 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54  _DistQueue : SRT
11410 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69  _DistFifo;.    i
11420 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
11430 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c  e->nTab++;.  }el
11440 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20  se{.    eDest = 
11450 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51  pOrderBy ? SRT_Q
11460 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b  ueue : SRT_Fifo;
11470 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
11480 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
11490 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20  stQueue, eDest, 
114a0 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41  iQueue);..  /* A
114b0 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
114c0 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65  for Current, Que
114d0 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74  ue, and Distinct
114e0 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e  . */.  regCurren
114f0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
11500 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  em;.  sqlite3Vdb
11510 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
11520 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65  enPseudo, iCurre
11530 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20  nt, regCurrent, 
11540 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72  nCol);.  if( pOr
11550 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
11560 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
11570 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
11580 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  rByKeyInfo(pPars
11590 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71  e, p, 1);.    sq
115a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
115b0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
115c0 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  ral, iQueue, pOr
115d0 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
115e0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
115f0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
11600 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
11610 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51  INFO);.    destQ
11620 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20  ueue.pOrderBy = 
11630 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73  pOrderBy;.  }els
11640 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
11650 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11660 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
11670 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d  ueue, nCol);.  }
11680 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
11690 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65 22  v, "Queue table"
116a0 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69  ));.  if( iDisti
116b0 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64  nct ){.    p->ad
116c0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
116d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
116e0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
116f0 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74  meral, iDistinct
11700 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  , 0);.    p->sel
11710 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
11720 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a  Ephemeral;.  }..
11730 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20    /* Detach the 
11740 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11750 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e  from the compoun
11760 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d  d SELECT */.  p-
11770 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a  >pOrderBy = 0;..
11780 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
11790 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
117a0 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65  tup-query in Que
117b0 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d  ue. */.  pSetup-
117c0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63  >pNext = 0;.  rc
117d0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
117e0 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c  (pParse, pSetup,
117f0 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20   &destQueue);.  
11800 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
11810 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  p;.  if( rc ) go
11820 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  to end_of_recurs
11830 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a  ive_query;..  /*
11840 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72   Find the next r
11850 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  ow in the Queue 
11860 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20  and output that 
11870 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70  row */.  addrTop
11880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
11890 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
118a0 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42  d, iQueue, addrB
118b0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
118c0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72  age(v);..  /* Tr
118d0 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74 20  ansfer the next 
118e0 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65  row in Queue ove
118f0 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a  r to Current */.
11900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11910 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f  Op1(v, OP_NullRo
11920 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a  w, iCurrent); /*
11930 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e   To reset column
11940 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20   cache */.  if( 
11950 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
11960 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11970 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
11980 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
11990 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75  ->nExpr+1, regCu
119a0 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  rrent);.  }else{
119b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
119d0 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
119e0 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  gCurrent);.  }. 
119f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11a00 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
11a10 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
11a20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c  Output the singl
11a30 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
11a40 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d   */.  addrCont =
11a50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11a60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65  Label(v);.  code
11a70 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66  Offset(v, regOff
11a80 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a  set, addrCont);.
11a90 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
11aa0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
11ab0 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74  pEList, iCurrent
11ac0 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44  ,.      0, 0, pD
11ad0 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61  est, addrCont, a
11ae0 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
11af0 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20   regLimit ){.   
11b00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b10 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
11b20 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  pZero, regLimit,
11b30 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
11b40 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11b50 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11b60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11b70 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
11b80 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
11b90 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
11ba0 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
11bb0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
11bc0 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
11bd0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
11be0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
11bf0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
11c00 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
11c10 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
11c20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  0;.  sqlite3Sele
11c30 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
11c40 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73  estQueue);.  ass
11c50 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
11c60 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  0 );.  p->pPrior
11c70 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a   = pSetup;..  /*
11c80 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
11c90 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
11ca0 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
11cb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
11cd0 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
11ce0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11cf0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11d00 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
11d10 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
11d20 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
11d30 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
11d40 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ->db, p->pOrderB
11d50 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42  y);.  p->pOrderB
11d60 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
11d70 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
11d80 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  it;.  p->pOffset
11d90 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65   = pOffset;.  re
11da0 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
11db0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  * SQLITE_OMIT_CT
11dc0 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  E */../* Forward
11dd0 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73   references */.s
11de0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
11df0 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
11e00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
11e10 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
11e20 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
11e30 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
11e40 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
11e50 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
11e60 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
11e70 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
11e80 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
11e90 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
11ea0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
11eb0 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73  /*.** Error mess
11ec0 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f  age for when two
11ed0 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   or more terms o
11ee0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
11ef0 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ect have differe
11f00 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c  nt.** size resul
11f10 74 20 73 65 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  t sets..*/.stati
11f20 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 72 6f  c void selectWro
11f30 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
11f40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
11f50 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
11f60 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
11f70 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
11f80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11f90 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
11fa0 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
11fb0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11fc0 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73   terms");.  }els
11fd0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
11fe0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11ff0 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
12000 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
12010 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
12020 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
12030 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
12040 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
12050 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
12060 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
12070 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
12080 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
12090 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
120a0 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
120b0 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
120c0 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
120d0 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
120e0 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
120f0 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
12100 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
12110 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
12120 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
12130 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
12140 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
12150 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
12160 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
12170 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
12180 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
12190 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
121a0 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20  **   (1) It has 
121b0 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
121c0 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20  ET.**   (2) All 
121d0 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
121e0 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
121f0 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
12200 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  Y clause.*/.stat
12210 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
12220 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
12230 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12240 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
12250 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
12260 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12270 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
12280 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
12290 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
122a0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
122b0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
122c0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
122d0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
122e0 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ect *pPrior;.  i
122f0 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
12300 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
12310 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
12320 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
12330 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
12340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
12350 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
12360 6c 6c 56 61 6c 75 65 73 20 29 3b 0a 20 20 64 6f  llValues );.  do
12370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
12380 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
12390 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73  alues );.    ass
123a0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  ert( p->op==TK_A
123b0 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b  LL || (p->op==TK
123c0 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50  _SELECT && p->pP
123d0 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20  rior==0) );.    
123e0 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
123f0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
12400 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
12410 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
12420 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 6e  pEList->nExpr!=n
12430 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 65  Expr ){.      se
12440 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
12450 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  sError(pParse, p
12460 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12470 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
12480 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
12490 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72  break;.    asser
124a0 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  t( p->pPrior->pN
124b0 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20  ext==p );.    p 
124c0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
124d0 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c   nRow++;.  }whil
124e0 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  e(1);.  while( p
124f0 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   ){.    pPrior =
12500 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12510 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
12530 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
12540 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e   pDest);.    p->
12550 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
12560 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
12570 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c  eak;.    p->nSel
12580 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  ectRow = nRow;. 
12590 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
125a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
125b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
125c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
125d0 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
125e0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
125f0 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
12600 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
12610 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
12620 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
12630 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
12640 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
12650 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
12660 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
12670 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
12680 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
12690 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
126a0 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
126b0 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
126c0 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
126d0 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
126e0 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
126f0 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
12700 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
12710 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
12720 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
12730 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
12740 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
12750 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
12760 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
12770 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
12780 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
12790 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
127a0 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
127b0 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
127c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
127d0 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
127e0 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
127f0 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
12800 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
12810 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
12820 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
12830 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12840 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
12850 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
12860 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
12870 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
12880 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12890 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
128a0 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
128b0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
128c0 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
128d0 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
128e0 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
128f0 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
12900 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
12910 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
12920 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
12930 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
12940 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
12950 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
12960 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
12970 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
12980 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
12990 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
129a0 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
129b0 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
129c0 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
129d0 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
129e0 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
129f0 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
12a00 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
12a10 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
12a20 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
12a30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12a40 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12a50 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12a60 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12a70 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12a80 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
12a90 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
12aa0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12ab0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12ac0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
12ad0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
12ae0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12af0 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
12b00 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
12b10 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
12b20 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
12b30 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
12b40 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
12b50 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
12b60 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
12b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
12b80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
12b90 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
12ba0 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
12bb0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
12bc0 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
12bd0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
12be0 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
12bf0 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
12c00 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
12c10 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
12c20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
12c30 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
12c40 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20  tion */.#ifndef 
12c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
12c60 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20  AIN.  int iSub1 
12c70 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
12c80 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
12c90 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
12ca0 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20  t iSub2 = 0;    
12cb0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
12cc0 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
12cd0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  y */.#endif..  /
12ce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
12cf0 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12d00 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
12d10 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
12d20 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
12d30 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
12d40 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
12d50 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
12d60 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
12d70 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
12d80 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
12d90 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
12da0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
12db0 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
12dc0 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ch */.  assert( 
12dd0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
12de0 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
12df0 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  || p->op==TK_ALL
12e00 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   || p->op==TK_UN
12e10 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  ION );.  db = pP
12e20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
12e30 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
12e40 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
12e50 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
12e60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
12e70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
12e80 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
12e90 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
12ea0 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
12eb0 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
12ec0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
12ed0 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
12ee0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
12ef0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
12f00 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
12f10 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
12f20 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12f30 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
12f40 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
12f50 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
12f60 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
12f70 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
12f80 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
12f90 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
12fa0 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
12fb0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
12fc0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
12fd0 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
12fe0 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
12ff0 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
13000 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
13010 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
13020 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
13030 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
13040 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
13050 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
13060 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
13070 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13080 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
13090 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
130a0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
130b0 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
130c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
130d0 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
130e0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
130f0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
13100 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74  ;.    dest.eDest
13110 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
13120 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  }..  /* Special 
13130 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63  handling for a c
13140 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
13150 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61  hat originates a
13160 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  s a VALUES claus
13170 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
13180 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
13190 6c 6c 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  llValues ){.    
131a0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
131b0 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
131c0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
131d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
131e0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
131f0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
13200 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
13210 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
13220 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
13230 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
13240 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
13250 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13260 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
13270 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
13280 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
13290 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
132a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
132b0 0a 20 20 20 20 73 65 6c 65 63 74 57 72 6f 6e 67  .    selectWrong
132c0 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
132d0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 72 63  arse, p);.    rc
132e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
132f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13300 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
13310 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
13320 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13330 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
13340 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
13350 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
13360 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
13370 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
13380 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
13390 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
133a0 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
133b0 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
133c0 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
133d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
133e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
133f0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
13400 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
13410 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
13420 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
13430 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
13440 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
13450 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
13460 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
13470 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
13480 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
13490 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
134a0 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
134b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
134c0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
134d0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
134e0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
134f0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
13500 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
13510 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
13520 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
13530 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
13540 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
13550 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
13560 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
13570 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
13580 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
13590 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
135a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
135b0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
135c0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
135d0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
135e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
135f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13600 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
13610 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
13620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
13630 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
13640 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
13650 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
13660 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
13670 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
13680 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
13690 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
136a0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
136b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
136c0 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
136d0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
136e0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
136f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
13700 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
13710 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
13720 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 6c      }.      expl
13730 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
13740 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
13750 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13770 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
13780 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74   &dest);.      t
13790 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
137a0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
137b0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
137c0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
137d0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
137e0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
137f0 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
13800 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
13810 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
13820 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  it.       && sql
13830 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
13840 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  r(pPrior->pLimit
13850 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
13860 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26    && nLimit>0 &&
13870 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
13880 20 28 75 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20   (u64)nLimit .  
13890 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
138a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
138b0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
138c0 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
138d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
138e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
138f0 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
13900 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13910 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
13920 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
13930 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
13940 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
13950 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
13960 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
13970 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
13980 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
13990 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
139a0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
139b0 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
139c0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
139d0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
139e0 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
139f0 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
13a00 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
13a10 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
13a20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
13a30 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
13a40 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
13a50 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
13a60 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
13a70 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
13a80 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
13a90 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
13aa0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
13ab0 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
13ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
13ad0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
13ae0 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
13af0 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
13b00 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
13b10 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
13b20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
13b30 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
13b40 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
13b50 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
13b60 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
13b70 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
13b80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13b90 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
13ba0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
13bb0 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
13bc0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
13bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13be0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
13bf0 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
13c00 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
13c10 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
13c20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
13c30 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
13c40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
13c50 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
13c60 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
13c70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
13c80 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
13c90 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
13ca0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
13cb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
13cc0 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
13cd0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
13ce0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13cf0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
13d00 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13d20 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
13d30 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
13d40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13d50 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
13d60 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
13d70 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
13d80 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
13d90 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
13da0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
13db0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
13dc0 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
13dd0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13de0 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
13df0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
13e00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13e10 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
13e20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13e30 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
13e40 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
13e50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
13e60 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
13e70 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
13e80 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
13e90 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
13ea0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
13eb0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
13ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
13ed0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
13ee0 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
13ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
13f00 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13f10 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13f20 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13f30 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
13f40 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
13f50 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
13f60 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
13f70 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
13f80 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
13f90 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
13fa0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
13fb0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
13fc0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
13fd0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
13fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
13ff0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
14000 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
14010 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
14020 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
14030 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
14040 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
14050 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
14060 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
14070 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
14080 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
14090 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
140a0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
140b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
140c0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
140d0 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
140e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
140f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
14100 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
14110 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
14120 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
14130 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
14140 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
14150 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
14160 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
14170 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
14180 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
14190 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
141a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
141b0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
141c0 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
141d0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
141e0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
141f0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
14200 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
14210 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
14220 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e  =TK_UNION ) p->n
14230 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
14240 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14260 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14270 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14280 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14290 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
142a0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
142b0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
142c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
142d0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
142e0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
142f0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
14300 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
14310 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
14320 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
14330 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
14340 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14350 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
14360 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
14370 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
14380 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
14390 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
143a0 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
143b0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
143c0 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
143d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
143e0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
143f0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
14400 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
14410 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
14420 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
14430 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
14440 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
14450 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
14460 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
14470 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14480 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14490 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
144a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
144b0 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
144c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
144d0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
144e0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
144f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14500 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
14510 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
14520 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
14530 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
14540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14550 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
14560 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
14570 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
14580 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
14590 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
145a0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
145b0 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
145c0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
145d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
145e0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14600 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
14610 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
14620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14630 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
14640 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
14650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14660 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
14670 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
14680 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14690 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
146a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
146b0 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
146c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
146d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
146e0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
146f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14700 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14710 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
14720 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
14730 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
14740 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
14750 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
14760 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
14770 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
14780 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
14790 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
147a0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
147b0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
147c0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
147d0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
147e0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
147f0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
14800 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
14810 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
14820 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
14830 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
14840 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
14850 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
14860 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
14870 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
14880 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14890 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
148a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
148b0 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
148c0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
148d0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
148e0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
148f0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
14900 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
14910 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
14920 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
14930 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
14940 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
14950 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
14960 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
14970 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
14980 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
14990 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
149a0 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
149b0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
149c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
149d0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
149e0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
149f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
14a00 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
14a10 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14a20 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
14a30 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
14a40 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
14a50 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14a60 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
14a70 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14a80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14a90 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14aa0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
14ab0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
14ac0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14ad0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
14ae0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
14af0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
14b00 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
14b10 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
14b20 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
14b30 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
14b40 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14b50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14b60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
14b70 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
14b80 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
14b90 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
14ba0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
14bb0 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
14bc0 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
14bd0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14be0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
14bf0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
14c00 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
14c10 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
14c20 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
14c30 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
14c40 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
14c50 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
14c60 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14c70 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
14c80 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14c90 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14ca0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14cb0 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
14cc0 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14cd0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14ce0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14cf0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14d00 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14d10 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14d20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
14d30 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
14d40 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
14d50 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
14d60 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14d80 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14d90 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14da0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14db0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14dc0 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
14dd0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
14de0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
14df0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
14e00 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
14e10 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
14e20 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
14e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
14e40 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
14e50 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
14e60 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
14e70 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
14e80 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
14e90 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
14ea0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
14eb0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
14ec0 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
14ed0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
14ee0 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
14ef0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
14f00 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
14f10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
14f20 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
14f30 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
14f40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14f50 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
14f60 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
14f70 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
14f80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
14f90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14fa0 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
14fb0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
14fc0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31  age(v);.      r1
14fd0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
14fe0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
14ff0 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
15000 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15010 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62  , OP_RowKey, tab
15020 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  1, r1);.      sq
15030 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
15040 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  nt(v, OP_NotFoun
15050 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20  d, tab2, iCont, 
15060 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  r1, 0); VdbeCove
15070 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
15080 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15090 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
150a0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
150b0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
150c0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
150d0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
150e0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
150f0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
15100 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
15110 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15120 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
15130 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15140 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15150 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
15160 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15170 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
15180 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15190 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
151a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
151b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
151c0 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
151d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151e0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
151f0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
15200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15210 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
15220 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
15230 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
15240 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
15250 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
15260 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
15270 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
15280 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
15290 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
152a0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
152b0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
152c0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
152d0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
152e0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
152f0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
15300 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
15310 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
15320 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
15330 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
15340 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
15350 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
15360 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
15370 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
15380 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
15390 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
153a0 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
153b0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
153c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
153d0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
153e0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
153f0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
15400 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
15410 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
15420 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15450 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
15460 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
15470 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
15480 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
15490 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
154a0 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
154b0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
154c0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
154d0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
154e0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
154f0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
15500 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
15510 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
15520 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
15530 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
15540 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15560 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
15570 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
15580 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
15590 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
155a0 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
155b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
155c0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
155d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
155e0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
155f0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
15600 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
15610 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15620 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
15630 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
15640 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61  }.    for(i=0, a
15650 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e  pColl=pKeyInfo->
15660 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69  aColl; i<nCol; i
15670 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20  ++, apColl++){. 
15680 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d       *apColl = m
15690 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
156a0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
156b0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61  .      if( 0==*a
156c0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
156d0 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   *apColl = db->p
156e0 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
156f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  }.    }..    for
15700 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
15710 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
15720 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72  rior){.      for
15730 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
15740 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
15750 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  r = pLoop->addrO
15760 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20  penEphm[i];.    
15770 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29      if( addr<0 )
15780 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
15790 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20  f [0] is unused 
157a0 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f  then [1] is also
157b0 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20   unused.  So we 
157c0 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  can.          **
157d0 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61   always safely a
157e0 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20  bort as soon as 
157f0 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64  the first unused
15800 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a   slot is found *
15810 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
15820 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f  rt( pLoop->addrO
15830 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a  penEphm[1]<0 );.
15840 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15870 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
15880 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
15890 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
158a0 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61  P4(v, addr, (cha
158b0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
158c0 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a  oRef(pKeyInfo),.
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
158f0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
15900 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
15910 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
15920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
15940 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  ref(pKeyInfo);. 
15950 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74   }..multi_select
15960 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69  _end:.  pDest->i
15970 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73  Sdst = dest.iSds
15980 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73  t;.  pDest->nSds
15990 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a  t = dest.nSdst;.
159a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
159b0 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
159c0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
159d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
159e0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
159f0 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
15a00 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
15a10 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
15a20 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
15a30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
15a40 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
15a50 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
15a60 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
15a70 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
15a80 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
15a90 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
15aa0 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
15ab0 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
15ac0 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
15ad0 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
15ae0 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
15af0 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
15b00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
15b10 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
15b20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
15b30 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
15b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
15b50 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
15b60 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
15b70 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
15b80 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
15b90 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
15ba0 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
15bb0 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
15bc0 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
15bd0 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
15be0 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
15bf0 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
15c00 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
15c10 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
15c20 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
15c30 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
15c40 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
15c50 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
15c60 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
15c70 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
15c80 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
15c90 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
15ca0 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
15cb0 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
15cc0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
15cd0 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
15ce0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
15cf0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15d00 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
15d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
15d20 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
15d30 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
15d40 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
15d50 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
15d60 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
15d70 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15d80 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
15d90 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
15da0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
15db0 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
15dc0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
15dd0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
15de0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
15df0 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
15e00 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
15e10 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
15e20 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
15e30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
15e40 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
15e50 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
15e60 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
15e70 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
15e80 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
15e90 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
15ea0 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
15eb0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
15ec0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15ed0 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
15ee0 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
15ef0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15f00 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15f10 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
15f20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15f30 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
15f40 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
15f50 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
15f60 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
15f70 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
15f80 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
15f90 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20   int j1, j2;.   
15fa0 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
15fb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
15fc0 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56  Not, regPrev); V
15fd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15fe0 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33      j2 = sqlite3
15ff0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16000 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69  _Compare, pIn->i
16010 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
16020 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20   pIn->nSdst,.   
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
16050 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
16060 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
16070 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
16080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16090 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32  3(v, OP_Jump, j2
160a0 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a  +2, iContinue, j
160b0 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  2+2); VdbeCovera
160c0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
160d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
160e0 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , j1);.    sqlit
160f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16100 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
16110 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
16120 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
16130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16140 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16150 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
16160 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
16170 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
16180 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
16190 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
161a0 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
161b0 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
161c0 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
161d0 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
161e0 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
161f0 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
16200 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  ;..  switch( pDe
16210 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
16220 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
16230 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
16240 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
16250 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16260 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
16270 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
16280 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
16290 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
162a0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
162b0 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
162c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
162d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
162e0 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
162f0 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
16300 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16310 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
16320 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
16330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16340 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16350 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
16360 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16370 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
16380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16390 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
163a0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
163b0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
163c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
163d0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
163e0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
163f0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
16400 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16410 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
16420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
16430 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16440 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
16450 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16460 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16470 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
16480 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
16490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
164a0 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
164b0 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
164c0 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
164d0 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
164e0 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
164f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
16500 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
16510 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
16520 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
16530 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
16540 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
16550 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
16560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16570 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
16580 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
16590 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
165a0 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst==1 );.      
165b0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
165c0 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
165d0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
165e0 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
165f0 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
16600 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  affSdst);.      
16610 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
16620 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
16630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16640 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
16650 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
16660 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44  Sdst, 1, r1, &pD
16670 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b  est->affSdst,1);
16680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16690 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
166a0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
166b0 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20  n->iSdst, 1);.  
166c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
166d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
166e0 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
166f0 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  DParm, r1);.    
16700 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
16710 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
16720 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
16730 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
16740 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
16750 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
16760 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
16770 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
16780 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
16790 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
167a0 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
167b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
167c0 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
167d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
167e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
167f0 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53  er, 1, pDest->iS
16800 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  DParm);.      /*
16810 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
16820 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
16830 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
16840 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
16850 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
16860 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16870 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
16880 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
16890 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
168a0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
168b0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
168c0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
168d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
168e0 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
168f0 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
16900 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
16910 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
16920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
16930 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
16940 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16950 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
16960 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
16970 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
16980 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
16990 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
169a0 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
169b0 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
169c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
169d0 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
169e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
169f0 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
16a00 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
16a10 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
16a20 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
16a30 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
16a40 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
16a50 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
16a60 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
16a70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
16a80 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
16a90 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
16aa0 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
16ab0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16ac0 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
16ad0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
16ae0 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
16af0 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
16b00 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
16b10 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
16b20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
16b30 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
16b40 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
16b50 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e  >iSdst, pDest->n
16b60 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
16b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16b80 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
16b90 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
16ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16bb0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
16bc0 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
16bd0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
16be0 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
16bf0 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
16c00 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
16c10 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
16c20 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
16c30 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
16c40 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
16c50 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
16c60 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
16c70 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
16c80 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
16c90 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
16ca0 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16cb0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16cc0 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
16cd0 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
16ce0 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
16cf0 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
16d00 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
16d10 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
16d20 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
16d30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
16d40 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
16d50 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
16d60 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
16d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16d80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16d90 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
16da0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
16db0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16dc0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16dd0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16de0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
16df0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
16e00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16e10 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
16e20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
16e30 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
16e40 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
16e50 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
16e60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
16e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16e80 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d  DecrJumpZero, p-
16e90 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29  >iLimit, iBreak)
16ea0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
16ec0 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75  erate the subrou
16ed0 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f  tine return.  */
16ee0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
16ef0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
16f00 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69  ontinue);.  sqli
16f10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16f20 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
16f30 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72  eturn);..  retur
16f40 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
16f50 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d   Alternative com
16f60 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64  pound select cod
16f70 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20  e generator for 
16f80 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65  cases when there
16f90 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20  .** is an ORDER 
16fa0 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  BY clause..**.**
16fb0 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65   We assume a que
16fc0 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ry of the follow
16fd0 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  ing form:.**.** 
16fe0 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20       <selectA>  
16ff0 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c  <operator>  <sel
17000 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20  ectB>  ORDER BY 
17010 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a  <orderbylist>.**
17020 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
17030 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41  s one of UNION A
17040 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  LL, UNION, EXCEP
17050 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e  T, or INTERSECT.
17060 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73    The idea.** is
17070 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73   to code both <s
17080 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c  electA> and <sel
17090 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f  ectB> with the O
170a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
170b0 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73  s.** co-routines
170c0 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20  .  Then run the 
170d0 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70  co-routines in p
170e0 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67  arallel and merg
170f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
17100 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
17110 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  .  In addition t
17120 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  o the two corout
17130 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c  ines (called sel
17140 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65  ectA and.** sele
17150 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37  ctB) there are 7
17160 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a   subroutines:.**
17170 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20  .**    outA:    
17180 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
17190 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63  of the selectA c
171a0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
171b0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
171c0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
171d0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
171e0 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20  *.**    outB:   
171f0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
17200 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20   of the selectB 
17210 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
17220 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
17230 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
17240 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
17250 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64   (Only generated
17260 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a   for UNION and.*
17270 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
17280 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54  ION ALL.  EXCEPT
17290 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20   and INSERTSECT 
172a0 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72  never output a r
172b0 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ow that.**      
172c0 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f         appears o
172d0 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a  nly in B.).**.**
172e0 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c      AltB:    Cal
172f0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17300 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17310 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17320 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65  A<B..**.**    Ae
17330 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  qB:    Called wh
17340 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
17350 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
17360 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a  tines and A==B..
17370 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20  **.**    AgtB:  
17380 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
17390 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
173a0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
173b0 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20   and A>B..**.** 
173c0 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c     EofA:    Call
173d0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
173e0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
173f0 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20  electA..**.**   
17400 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64   EofB:    Called
17410 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
17420 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
17430 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ectB..**.** The 
17440 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
17450 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76  f the latter fiv
17460 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65  e subroutines de
17470 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a  pend on which .*
17480 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
17490 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20  used:.**.**.**  
174a0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
174b0 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49   ALL         UNI
174c0 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58  ON            EX
174d0 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e  CEPT          IN
174e0 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20  TERSECT.**      
174f0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17500 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
17510 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
17520 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
17530 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74  -------.**   Alt
17540 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
17550 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
17560 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  A       outA, ne
17570 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
17580 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20  A.**.**   AeqB: 
17590 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
175a0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
175b0 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
175c0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
175d0 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20  A.**.**   AgtB: 
175e0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
175f0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
17600 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20          nextB   
17610 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a           nextB.*
17620 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f  *.**   EofA:   o
17630 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
17640 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17650 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20       halt       
17660 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
17670 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c     EofB:   outA,
17680 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
17690 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
176a0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
176b0 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20    halt.**.** In 
176c0 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  the AltB, AeqB, 
176d0 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74  and AgtB subrout
176e0 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20  ines, an EOF on 
176f0 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  A following next
17700 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69  A.** causes an i
17710 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f  mmediate jump to
17720 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46   EofA and an EOF
17730 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20   on B following 
17740 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20  nextB causes.** 
17750 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
17760 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68  p to EofB.  With
17770 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  in EofA and EofB
17780 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74  , and EOF on ent
17790 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  ry or.** followi
177a0 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20  ng nextX causes 
177b0 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  a jump to the en
177c0 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  d of the select 
177d0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
177e0 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  * Duplicate remo
177f0 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e  val in the UNION
17800 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
17810 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73  TERSECT cases is
17820 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68   handled.** with
17830 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  in the output su
17840 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72  broutine.  The r
17850 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20  egPrev register 
17860 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72  set holds the pr
17870 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70  eviously.** outp
17880 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d  ut value.  A com
17890 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20  parison is made 
178a0 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c  against this val
178b0 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75  ue and the outpu
178c0 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20  t.** is skipped 
178d0 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  if the next resu
178e0 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65  lts would be the
178f0 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65   same as the pre
17900 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  vious..**.** The
17910 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17920 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65  plan is to imple
17930 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72  ment the two cor
17940 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65  outines and seve
17950 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73  n.** subroutines
17960 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74   first, then put
17970 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67   the control log
17980 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  ic at the bottom
17990 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  .  Like this:.**
179a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74  .**          got
179b0 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f  o Init.**     co
179c0 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  A: coroutine for
179d0 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a   left query (A).
179e0 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f  **     coB: coro
179f0 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
17a00 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20  query (B).**    
17a10 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outA: output one
17a20 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20   row of A.**    
17a30 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65  outB: output one
17a40 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e   row of B (UNION
17a50 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   and UNION ALL o
17a60 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  nly).**    EofA:
17a70 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a   ....**    EofB:
17a80 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a   ....**    AltB:
17a90 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a   ....**    AeqB:
17aa0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a   ....**    AgtB:
17ab0 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a   ....**    Init:
17ac0 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f   initialize coro
17ad0 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a  utine registers.
17ae0 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c  **          yiel
17af0 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20  d coA.**        
17b00 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f    if eof(A) goto
17b10 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20   EofA.**        
17b20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20    yield coB.**  
17b30 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42          if eof(B
17b40 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20  ) goto EofB.**  
17b50 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20    Cmpr: Compare 
17b60 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20  A, B.**         
17b70 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42   Jump AltB, AeqB
17b80 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e  , AgtB.**     En
17b90 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  d: ....**.** We 
17ba0 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c  call AltB, AeqB,
17bb0 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64   AgtB, EofA, and
17bc0 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e   EofB "subroutin
17bd0 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65  es" but they are
17be0 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79   not.** actually
17bf0 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f   called using Go
17c00 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20  sub and they do 
17c10 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66  not Return.  Eof
17c20 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a  A and EofB loop.
17c30 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74  ** until all dat
17c40 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74  a is exhausted t
17c50 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  hen jump to the 
17c60 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74  "end" labe.  Alt
17c70 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20  B, AeqB,.** and 
17c80 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74  AgtB jump to eit
17c90 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65  her L2 or to one
17ca0 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42   of EofA or EofB
17cb0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
17cc0 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
17cd0 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20  D_SELECT.static 
17ce0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
17cf0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
17d00 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
17d10 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
17d20 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
17d30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
17d40 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
17d50 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
17d60 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
17d70 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
17d80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
17d90 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
17da0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
17db0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
17dc0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17dd0 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  s */.  Select *p
17de0 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
17df0 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
17e00 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
17e10 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
17e20 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
17e30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
17e40 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
17e50 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
17e60 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65  destA;     /* De
17e70 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
17e80 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53  routine A */.  S
17e90 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b  electDest destB;
17ea0 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74       /* Destinat
17eb0 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e  ion for coroutin
17ec0 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  e B */.  int reg
17ed0 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f  AddrA;         /
17ee0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
17ef0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
17f00 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
17f10 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20  nt regAddrB;    
17f20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
17f30 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
17f40 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
17f50 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
17f60 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
17f70 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
17f80 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
17f90 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
17fa0 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
17fb0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
17fc0 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
17fd0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
17fe0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
17ff0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
18000 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
18010 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18020 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
18030 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18040 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18050 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
18060 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18070 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
18080 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18090 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
180a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
180b0 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20  addrOutB = 0;   
180c0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
180d0 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
180e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
180f0 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
18100 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
18110 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
18120 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
18130 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18140 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a  EofA_noB;     /*
18150 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45   Alternate addrE
18160 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e  ofA if B is unin
18170 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
18180 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
18190 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
181a0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
181b0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
181c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
181d0 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
181e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
181f0 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
18200 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
18210 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
18220 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
18230 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
18240 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
18250 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18260 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
18270 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18280 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
18290 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
182a0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
182b0 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
182c0 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
182d0 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
182e0 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
182f0 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
18300 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
18310 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
18320 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
18330 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
18340 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
18350 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
18360 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
18370 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
18380 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
18390 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
183a0 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
183b0 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
183c0 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
183d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
183e0 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
183f0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
18400 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
18410 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
18420 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
18430 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
18440 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
18450 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
18460 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
18470 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
18480 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
18490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
184a0 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
184b0 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
184c0 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
184d0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
184e0 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
184f0 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
18500 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
18510 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
18520 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
18530 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
18540 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18550 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
18560 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
18570 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
18580 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18590 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
185a0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
185b0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
185c0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
185d0 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
185e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
185f0 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
18600 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
18610 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
18620 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
18630 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
18640 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
18650 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66  t columns */.#if
18660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18670 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
18680 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
18690 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
186a0 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
186b0 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
186c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
186d0 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
186e0 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
186f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
18700 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
18710 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
18720 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
18730 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
18740 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
18750 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
18760 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
18770 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
18780 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
18790 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
187a0 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
187b0 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
187c0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
187d0 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
187e0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
187f0 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
18800 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18810 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
18820 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
18830 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
18840 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
18850 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
18860 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
18870 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
18880 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
18890 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
188a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
188b0 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
188c0 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
188d0 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
188e0 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
188f0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
18900 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
18910 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
18920 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18930 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
18940 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
18950 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
18960 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
18970 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
18980 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
18990 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
189a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
189b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
189c0 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
189d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
189e0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
189f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18a00 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
18a10 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
18a20 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
18a30 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
18a40 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
18a50 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
18a60 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
18a70 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
18a80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
18a90 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
18aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18ab0 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
18ac0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
18ad0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
18ae0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
18af0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
18b00 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
18b10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18b20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
18b30 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
18b40 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
18b50 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20  >u.iValue = i;. 
18b60 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
18b70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
18b80 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
18b90 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b  pOrderBy, pNew);
18ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72  .        if( pOr
18bb0 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42 79  derBy ) pOrderBy
18bc0 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e  ->a[nOrderBy++].
18bd0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
18be0 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
18bf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
18c00 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
18c10 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
18c20 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
18c30 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
18c40 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
18c50 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
18c60 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
18c70 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
18c80 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
18c90 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
18ca0 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
18cb0 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
18cc0 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
18cd0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18ce0 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
18cf0 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
18d00 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
18d10 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
18d20 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
18d30 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
18d40 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
18d50 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
18d60 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
18d70 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
18d80 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
18d90 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
18da0 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
18db0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
18dc0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
18dd0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
18de0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
18df0 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
18e00 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
18e10 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18e20 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20  OrderByCol>0.   
18e30 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
18e40 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18e50 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
18e60 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
18e70 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
18e80 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
18e90 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
18ea0 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
18eb0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
18ec0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
18ed0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
18ee0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
18ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
18f00 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
18f10 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
18f20 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
18f30 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
18f40 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
18f50 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
18f60 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
18f70 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
18f80 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
18f90 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
18fa0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
18fb0 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
18fc0 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
18fd0 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
18fe0 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
18ff0 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19000 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19010 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19020 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19030 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
19040 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
19050 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
19060 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
19070 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
19080 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19090 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
190a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
190b0 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
190c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
190d0 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
190e0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
190f0 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19100 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19130 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
19140 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
19150 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
19160 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
19170 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
19180 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19190 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
191a0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
191b0 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
191c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
191d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
191e0 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
191f0 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
19200 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
19210 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
19220 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
19230 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
19240 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
19250 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
19260 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
19270 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
19280 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
19290 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
192a0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
192b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
192c0 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
192d0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
192e0 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
192f0 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
19300 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
19310 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
19320 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
19330 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
19340 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
19350 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
19360 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
19370 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
19380 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
19390 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
193a0 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
193b0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
193c0 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
193d0 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
193e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
193f0 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
19400 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
19410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19430 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
19440 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
19450 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
19460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
19480 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
19490 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
194a0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
194b0 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
194c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
194d0 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
194e0 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
194f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
19500 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
19510 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
19520 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
19530 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
19540 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
19550 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
19560 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
19570 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
19580 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
19590 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
195a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
195b0 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
195c0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
195d0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
195e0 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
195f0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
19600 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
19610 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
19620 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
19630 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
19640 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19650 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
19660 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
19670 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
19680 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
19690 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
196a0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
196b0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
196c0 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
196d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
196e0 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a  Addr(v) + 1;.  j
196f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
19700 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
19710 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19720 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65  drA, 0, addrSele
19730 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  ctA);.  VdbeComm
19740 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45  ent((v, "left SE
19750 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f  LECT"));.  pPrio
19760 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  r->iLimit = regL
19770 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e  imitA;.  explain
19780 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
19790 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
197a0 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69  electId);.  sqli
197b0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
197c0 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
197d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
197e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
197f0 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
19800 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
19810 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
19820 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
19830 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
19840 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
19850 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19860 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
19870 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
19880 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
19890 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
198a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
198b0 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
198c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
198d0 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
198e0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
198f0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
19900 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
19910 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
19920 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
19930 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
19940 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
19950 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
19960 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
19970 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
19980 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
19990 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
199a0 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
199b0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
199c0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
199d0 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
199e0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
199f0 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
19a00 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
19a10 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
19a20 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
19a30 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
19a40 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65  AddrB);..  /* Ge
19a50 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19a60 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
19a70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
19a80 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
19a90 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
19aa0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
19ab0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
19ac0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
19ad0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
19ae0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
19af0 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
19b00 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
19b10 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
19b20 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
19b30 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
19b40 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
19b50 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
19b60 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
19b70 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
19b80 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
19b90 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
19ba0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
19bb0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
19bc0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
19bd0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
19be0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
19bf0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
19c00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
19c10 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
19c20 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
19c30 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
19c40 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
19c50 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
19c60 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
19c70 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
19c80 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
19ca0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
19cb0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
19cc0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
19cd0 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c  , pKeyDup, label
19ce0 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  End);.  }.  sqli
19cf0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
19d00 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20  pKeyDup);..  /* 
19d10 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19d20 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
19d30 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
19d40 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
19d50 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
19d60 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
19d70 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
19d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
19d90 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
19da0 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
19db0 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  {.    addrEofA_n
19dc0 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20  oB = addrEofA = 
19dd0 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73  labelEnd;.  }els
19de0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
19df0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
19e00 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
19e10 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  );.    addrEofA 
19e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
19e30 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
19e40 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
19e50 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  tB);.    addrEof
19e60 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56  A_noB = sqlite3V
19e70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19e80 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
19e90 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ec0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19ed0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19ee0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
19ef0 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29  to, 0, addrEofA)
19f00 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
19f10 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
19f20 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a  SelectRow;.  }..
19f30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19f40 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
19f50 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
19f60 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
19f70 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
19f80 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
19f90 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
19fa0 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
19fb0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
19fc0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
19fd0 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
19fe0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
19ff0 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1a000 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1a010 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1a020 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1a030 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1a040 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a050 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1a060 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a070 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1a080 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a090 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1a0a0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1a0b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a0c0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a0d0 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1a0e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a0f0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1a100 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a110 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
1a120 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
1a130 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a140 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a150 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
1a160 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a170 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
1a180 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
1a190 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a1a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1a1b0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
1a1c0 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
1a1d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a1e0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a1f0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64  A, addrEofA); Vd
1a200 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a210 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a220 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a230 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1a240 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a250 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1a260 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1a270 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1a280 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1a290 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1a2a0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1a2b0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a2c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1a2d0 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1a2e0 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1a2f0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1a300 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1a310 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1a320 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1a330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a340 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a350 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a360 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1a370 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1a380 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a390 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
1a3a0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1a3b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1a3c0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1a3d0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1a3e0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a3f0 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1a400 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1a410 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1a420 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1a430 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1a440 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1a450 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1a460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a470 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1a480 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1a490 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1a4a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1a4b0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1a4c0 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1a4d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1a4e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a4f0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
1a500 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1a510 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1a520 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1a530 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1a540 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a550 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
1a560 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a570 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a580 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a590 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1a5a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1a5b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a5d0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1a5e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a5f0 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1a600 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1a610 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1a620 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a630 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1a640 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1a650 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1a660 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1a670 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1a680 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1a690 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1a6a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1a6b0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1a6c0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1a6d0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6f0 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1a700 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1a710 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a720 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1a730 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1a740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a750 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1a760 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1a770 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1a780 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1a790 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1a7a0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1a7b0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1a7c0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1a7d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1a7e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1a7f0 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1a800 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1a810 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1a820 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1a830 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1a840 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1a850 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1a860 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1a870 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1a880 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1a890 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1a8a0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1a8b0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
1a8c0 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
1a8d0 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
1a8e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
1a8f0 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
1a900 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
1a910 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
1a920 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1a930 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
1a940 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
1a950 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1a960 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
1a970 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
1a980 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50  r = pPrior;.  pP
1a990 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  rior->pNext = p;
1a9a0 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
1a9b0 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
1a9c0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
1a9d0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
1a9e0 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
1a9f0 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
1aa00 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
1aa10 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
1aa20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
1aa30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
1aa40 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65  e->nErr!=0;.}.#e
1aa50 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
1aa60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1aa70 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1aa80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1aa90 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
1aaa0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1aab0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1aac0 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
1aad0 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
1aae0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
1aaf0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
1ab00 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
1ab10 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
1ab20 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
1ab30 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1ab40 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1ab50 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1ab60 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1ab70 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1ab80 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1ab90 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1aba0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1abb0 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1abc0 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1abd0 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1abe0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1abf0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1ac00 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1ac10 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1ac20 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1ac30 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1ac40 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1ac50 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1ac60 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1ac70 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1ac80 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1ac90 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1aca0 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1acb0 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1acc0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1acd0 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1ace0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1acf0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1ad00 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
1ad10 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1ad20 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
1ad30 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
1ad40 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
1ad50 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
1ad60 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
1ad70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
1ad80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1ad90 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
1ada0 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
1adb0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1adc0 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
1add0 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
1ade0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1adf0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1ae00 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
1ae10 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
1ae20 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
1ae30 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1ae40 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
1ae50 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
1ae60 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1ae70 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
1ae80 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
1ae90 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
1aea0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
1aeb0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
1aec0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1aed0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
1aee0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
1aef0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1af00 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
1af10 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
1af20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1af30 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
1af40 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
1af50 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
1af60 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
1af70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
1af80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
1af90 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
1afa0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
1afb0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1afc0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c  3ExprDup(db, pEL
1afd0 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
1afe0 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29  olumn].pExpr, 0)
1aff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1b000 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1b010 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70  xpr);.      pExp
1b020 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
1b030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78    }else{.    pEx
1b040 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1b050 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
1b060 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
1b070 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  pEList);.    pEx
1b080 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1b090 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
1b0a0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
1b0b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  , pEList);.    i
1b0c0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
1b0d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1b0e0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
1b0f0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
1b100 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
1b110 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b120 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
1b130 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1b140 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  st(db, pExpr->x.
1b150 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
1b160 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1b170 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
1b180 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1b190 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
1b1a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1b1b0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1b1c0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
1b1d0 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
1b1e0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
1b1f0 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
1b200 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
1b210 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
1b220 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b230 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b240 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1b250 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1b260 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
1b270 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
1b280 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
1b290 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1b2a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1b2b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1b2c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
1b2d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1b2e0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b2f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1b300 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
1b310 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
1b320 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
1b330 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
1b340 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1b350 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1b360 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
1b370 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1b380 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
1b390 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
1b3a0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1b3b0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
1b3c0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1b3d0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
1b3e0 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
1b3f0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1b400 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
1b410 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  alues */.){.  Sr
1b420 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1b430 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1b440 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1b450 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1b460 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
1b470 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
1b480 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
1b490 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
1b4a0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
1b4b0 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
1b4c0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
1b4d0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
1b4e0 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
1b4f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
1b500 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1b510 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
1b520 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
1b530 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  st);.  p->pWhere
1b540 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b550 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
1b560 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
1b570 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
1b580 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
1b590 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72  , pEList);.  pSr
1b5a0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
1b5b0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20  ssert( pSrc );  
1b5c0 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c  /* Even for (SEL
1b5d0 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20  ECT 1) we have: 
1b5e0 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63  pSrc!=0 but pSrc
1b5f0 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69  ->nSrc==0 */.  i
1b600 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20  f( ALWAYS(pSrc) 
1b610 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  ){.    for(i=pSr
1b620 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1b630 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1b640 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1b650 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
1b660 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1b670 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
1b680 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
1b690 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1b6a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1b6b0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1b6c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b6d0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1b6e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b6f0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b700 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b710 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1b720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1b730 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1b740 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1b750 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1b760 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1b770 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1b780 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1b790 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1b7a0 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1b7b0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1b7c0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1b7d0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1b7e0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1b7f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1b800 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1b810 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1b820 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1b830 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1b840 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1b850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1b860 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1b870 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1b880 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1b890 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1b8a0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1b8b0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1b8c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b8d0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1b8e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1b8f0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1b900 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1b910 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1b920 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1b930 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1b940 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1b950 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1b960 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1b970 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1b980 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1b990 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1b9a0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1b9b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1b9c0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1b9d0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1b9e0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1b9f0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1ba00 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1ba10 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1ba20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1ba30 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1ba40 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1ba50 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1ba60 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1ba70 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1ba80 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1ba90 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1baa0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1bab0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1bac0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1bad0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1bae0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1baf0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1bb00 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1bb10 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1bb20 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1bb30 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
1bb40 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
1bb50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1bb60 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
1bb70 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1bb80 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1bb90 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1bba0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
1bbb0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
1bbc0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1bbd0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1bbe0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1bbf0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1bc00 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  oin.**        an
1bc10 64 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72  d (2b) the outer
1bc20 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1bc30 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f  use subqueries o
1bc40 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1bc50 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d  e.**        FROM
1bc60 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1bc70 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1bc80 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e  date for flatten
1bc90 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20  ing.  (2b is.** 
1bca0 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69         due to ti
1bcb0 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1bcc0 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30  f9abf80] from 20
1bcd0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1bce0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1bcf0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1bd00 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1bd10 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1bd20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1bd30 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1bd40 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1bd50 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1bd60 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1bd70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bd80 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1bd90 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1bda0 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1bdb0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1bdc0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1bdd0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1bde0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1bdf0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1be00 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1be10 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1be20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1be30 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1be40 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1be50 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1be60 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1be70 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1be80 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1be90 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1bea0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1beb0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1bec0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1bed0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1bee0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1bef0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1bf00 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1bf10 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1bf20 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1bf30 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1bf40 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1bf50 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1bf60 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1bf70 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1bf80 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1bf90 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1bfa0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1bfb0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1bfc0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1bfd0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1bfe0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1bff0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c000 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1c010 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1c020 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1c030 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c040 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c050 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c060 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1c070 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1c080 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1c090 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1c0a0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1c0b0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1c0c0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1c0d0 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1c0e0 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1c0f0 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1c100 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1c110 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1c120 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1c130 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c140 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1c150 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1c160 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
1c170 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a   use LIMIT.".**.
1c180 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1c190 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1c1a0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1c1b0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
1c1c0 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
1c1d0 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
1c1e0 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
1c1f0 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
1c200 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
1c210 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
1c220 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
1c230 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
1c240 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
1c250 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
1c260 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
1c270 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
1c280 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1c290 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1c2a0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1c2b0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c2c0 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
1c2d0 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
1c2e0 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
1c2f0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1c300 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
1c310 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1c320 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1c330 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
1c340 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1c350 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1c360 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1c370 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1c380 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1c390 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1c3a0 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
1c3b0 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
1c3c0 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
1c3d0 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1c3e0 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1c3f0 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1c400 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1c410 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1c420 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1c430 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1c440 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
1c450 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1c460 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
1c470 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
1c480 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
1c490 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
1c4a0 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
1c4b0 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
1c4c0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
1c4d0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
1c4e0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
1c4f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1c500 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
1c510 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1c520 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
1c530 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1c540 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1c550 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
1c560 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1c570 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
1c580 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1c590 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1c5a0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1c5b0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1c5c0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1c5d0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1c5e0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1c5f0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1c600 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1c610 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1c620 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1c630 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1c640 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1c650 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1c660 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1c670 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1c680 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1c690 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1c6a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1c6b0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1c6c0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1c6d0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1c6e0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1c6f0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1c700 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1c710 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1c720 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1c730 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1c740 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1c750 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1c760 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1c770 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1c780 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1c790 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1c7a0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1c7b0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1c7c0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1c7d0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1c7e0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1c7f0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1c800 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1c810 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1c820 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1c830 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1c840 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1c850 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1c860 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1c870 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1c880 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1c890 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1c8a0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1c8b0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1c8c0 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
1c8d0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1c8e0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1c8f0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1c900 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1c910 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1c920 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
1c930 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c940 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1c950 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1c960 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1c970 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
1c980 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
1c990 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
1c9a0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1c9b0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1c9c0 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
1c9d0 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
1c9e0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1c9f0 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
1ca00 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
1ca10 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
1ca20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
1ca30 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
1ca40 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1ca50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1ca60 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
1ca70 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
1ca80 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
1ca90 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
1caa0 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
1cab0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
1cac0 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
1cad0 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
1cae0 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
1caf0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
1cb00 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1cb10 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1cb20 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1cb30 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1cb40 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1cb50 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1cb60 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1cb70 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1cb80 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
1cb90 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
1cba0 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65    (23)  The pare
1cbb0 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  nt is not a recu
1cbc0 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68  rsive CTE, or th
1cbd0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1cbe0 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63  ot a.**        c
1cbf0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1cc00 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1cc10 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1cc20 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1cc30 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1cc40 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1cc50 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1cc60 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1cc70 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1cc80 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1cc90 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1cca0 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20 73  .**  (24)  The s
1ccb0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1ccc0 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61 74  n aggregate that
1ccd0 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74 2d   uses the built-
1cce0 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a 20  in min() or .** 
1ccf0 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29 20         or max() 
1cd00 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69 74  functions.  (Wit
1cd10 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72 69  hout this restri
1cd20 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20 6c  ction, a query l
1cd30 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20 22  ike:.**        "
1cd40 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53  SELECT x FROM (S
1cd50 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78 20  ELECT max(y), x 
1cd60 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64 20  FROM t1)" would 
1cd70 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a  not necessarily.
1cd80 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  **        return
1cd90 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f 72   the value X for
1cda0 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61 78   which Y was max
1cdb0 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  imal.).**.**.** 
1cdc0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
1cdd0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
1cde0 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
1cdf0 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
1ce00 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
1ce10 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
1ce20 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
1ce30 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
1ce40 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
1ce50 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
1ce60 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
1ce70 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
1ce80 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
1ce90 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1cea0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1ceb0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
1cec0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ced0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
1cee0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
1cef0 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
1cf00 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
1cf10 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
1cf20 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
1cf30 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
1cf40 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
1cf50 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
1cf60 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
1cf70 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
1cf80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1cf90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1cfa0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
1cfb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1cfc0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
1cfd0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1cfe0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1cff0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1d000 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
1d010 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1d020 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
1d030 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d040 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
1d050 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
1d060 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1d070 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
1d080 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
1d090 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
1d0a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1d0b0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
1d0c0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
1d0d0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1d0e0 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1d0f0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1d100 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1d110 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
1d120 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
1d130 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
1d140 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
1d150 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
1d160 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
1d170 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
1d180 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
1d190 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
1d1a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
1d1b0 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
1d1c0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
1d1d0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1d1e0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
1d1f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1d200 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1d210 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
1d220 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1d230 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d240 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
1d250 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
1d260 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
1d270 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
1d280 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
1d290 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
1d2a0 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
1d2b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
1d2c0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
1d2d0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
1d2e0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1d2f0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1d300 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
1d310 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1d320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1d330 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1d340 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d350 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
1d360 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1d370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1d380 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1d390 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
1d3a0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
1d3b0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
1d3c0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
1d3d0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d3e0 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
1d3f0 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1d400 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
1d410 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
1d420 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
1d430 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
1d440 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
1d450 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
1d460 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1d470 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
1d480 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
1d490 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
1d4a0 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
1d4b0 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
1d4c0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
1d4d0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
1d4e0 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
1d4f0 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
1d500 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
1d510 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
1d520 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
1d530 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20 69  Agg ){.    if( i
1d540 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b  sAgg ) return 0;
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1d580 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  1)   */.    if( 
1d590 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
1d5a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1d5d0 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66 28  (2a)  */.    if(
1d5e0 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20 45   (p->pWhere && E
1d5f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d600 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62 71  ->pWhere,EP_Subq
1d610 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20 28  uery)).     || (
1d620 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
1d630 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29 20  lags(p->pEList) 
1d640 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d  & EP_Subquery)!=
1d650 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74  0.     || (sqlit
1d660 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28  e3ExprListFlags(
1d670 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20 45  p->pOrderBy) & E
1d680 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20  P_Subquery)!=0. 
1d690 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1d6a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d6d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1d6e0 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  b)  */.    }.  }
1d6f0 0a 20 20 20 20 0a 20 20 70 53 75 62 53 72 63 20  .    .  pSubSrc 
1d700 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
1d710 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
1d720 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
1d730 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
1d740 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
1d750 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
1d760 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
1d770 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
1d780 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73  rary expressions
1d790 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
1d7a0 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
1d7b0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1d7c0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
1d7d0 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
1d7e0 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
1d7f0 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
1d800 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
1d810 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
1d820 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
1d830 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
1d840 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
1d850 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
1d860 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
1d870 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1d880 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
1d890 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d8a0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d8b0 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
1d8c0 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
1d8d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d900 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
1d910 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1d920 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d  & SF_Compound)!=
1d930 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  0 && pSub->pLimi
1d940 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1d950 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d980 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 35   Restriction (15
1d990 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  ) */.  }.  if( p
1d9a0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20  SubSrc->nSrc==0 
1d9b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d9e0 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (7)  */.  if( p
1d9f0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1da00 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  SF_Distinct ) re
1da10 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1da20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1da30 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28 20 70   (5)  */.  if( p
1da40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1da50 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20  pSrc->nSrc>1 || 
1da60 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 72  isAgg) ){.     r
1da70 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1da80 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1da90 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20   (8)(9) */.  }. 
1daa0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1dab0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1dac0 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
1dad0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
1dae0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
1daf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
1db00 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
1db10 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
1db20 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1db30 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1db70 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
1db80 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
1db90 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1dba0 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dbc0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
1dbd0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1dbe0 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
1dbf0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
1dc20 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1dc30 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d 3e 73  >pLimit && (p->s
1dc40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1dc50 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20 20 20  tinct)!=0 ){.   
1dc60 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1dc70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1dc80 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (21) */.  }. 
1dc90 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d   testcase( pSub-
1dca0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1dcb0 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 74 65  ecursive );.  te
1dcc0 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1dcd0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d  lFlags & SF_MinM
1dce0 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28 20 70  axAgg );.  if( p
1dcf0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1dd00 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c 53 46  (SF_Recursive|SF
1dd10 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20  _MinMaxAgg) ){. 
1dd20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1dd30 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32 32  Restrictions (22
1dd40 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20  ) and (24) */.  
1dd50 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1dd60 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1dd70 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1dd80 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
1dd90 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1dda0 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d  tion (23) */.  }
1ddb0 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
1ddc0 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
1ddd0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
1dde0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ddf0 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
1de00 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
1de10 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
1de20 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
1de30 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
1de40 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
1de50 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
1de60 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
1de70 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
1de80 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
1de90 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
1dea0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
1deb0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
1dec0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
1ded0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
1dee0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
1def0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
1df00 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
1df10 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
1df20 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
1df30 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
1df40 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
1df50 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
1df60 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
1df70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
1df80 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1df90 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
1dfa0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
1dfb0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
1dfc0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
1dfd0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
1dfe0 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
1dff0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
1e000 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
1e010 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
1e020 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
1e030 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
1e040 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
1e050 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1e060 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1e070 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1e080 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1e090 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1e0a0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
1e0b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
1e0c0 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
1e0d0 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
1e0e0 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
1e0f0 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
1e100 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
1e110 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
1e120 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
1e130 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
1e140 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
1e150 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
1e160 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
1e170 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
1e180 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
1e190 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
1e1a0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
1e1b0 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
1e1c0 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
1e1d0 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
1e1e0 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
1e1f0 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
1e200 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
1e210 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1e220 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
1e230 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
1e240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
1e250 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
1e260 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1e270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1e280 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
1e290 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
1e2a0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1e2b0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1e2c0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
1e2d0 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
1e2e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1e2f0 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
1e300 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
1e310 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
1e320 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
1e330 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1e340 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
1e350 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
1e360 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
1e370 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
1e380 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
1e390 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
1e3a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1e3b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1e3c0 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20 2a  Restriction 20 *
1e3d0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1e3e0 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1e3f0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1e400 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1e410 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1e420 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1e430 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1e440 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1e450 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1e460 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1e470 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1e480 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1e490 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1e4a0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1e4b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e4c0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1e4d0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1e4e0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1e4f0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1e500 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e510 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1e520 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
1e530 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1e540 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1e550 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
1e560 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
1e570 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
1e580 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
1e590 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1e5a0 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20  rc->nSrc<1.     
1e5b0 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73    || pSub->pELis
1e5c0 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31 2d  t->nExpr!=pSub1-
1e5d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20  >pEList->nExpr. 
1e5e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1e5f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1e600 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
1e610 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
1e620 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
1e630 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e640 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66  on 18. */.    if
1e650 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1e660 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1e670 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1e680 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1e690 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1e6a0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1e6b0 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1e6c0 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1e6d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1e6e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1e6f0 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1e700 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1e710 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1e720 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1e730 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1e740 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1e750 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1e760 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1e770 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1e780 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1e790 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1e7a0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1e7b0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1e7c0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1e7d0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1e7e0 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1e7f0 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1e800 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e810 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1e820 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1e830 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1e840 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1e850 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1e860 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1e870 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1e880 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1e890 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1e8a0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1e8b0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1e8c0 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1e8d0 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1e8e0 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1e8f0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1e900 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1e910 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1e920 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1e930 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1e940 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1e950 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1e960 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1e970 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1e980 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1e990 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1e9a0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1e9b0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1e9c0 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1e9d0 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1e9e0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1e9f0 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1ea00 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1ea10 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1ea20 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1ea30 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1ea40 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1ea50 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1ea60 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
1ea70 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ea80 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
1ea90 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
1eaa0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
1eab0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
1eac0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
1ead0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1eae0 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
1eaf0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
1eb00 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1eb10 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1eb20 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1eb30 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
1eb40 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1eb50 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1eb60 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
1eb70 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
1eb80 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
1eb90 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
1eba0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
1ebb0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
1ebc0 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
1ebd0 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
1ebe0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
1ebf0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1ec00 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
1ec10 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
1ec20 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1ec30 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1ec40 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
1ec50 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
1ec60 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
1ec70 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
1ec80 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
1ec90 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
1eca0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1ecb0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
1ecc0 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
1ecd0 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
1ece0 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
1ecf0 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
1ed00 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
1ed10 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
1ed20 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1ed30 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
1ed40 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
1ed50 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
1ed60 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
1ed70 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
1ed80 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
1ed90 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
1eda0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
1edb0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
1edc0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
1edd0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
1ede0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
1edf0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
1ee00 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
1ee10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1ee20 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
1ee30 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
1ee40 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
1ee50 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
1ee60 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
1ee70 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
1ee80 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1ee90 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
1eea0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
1eeb0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
1eec0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1eed0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1eee0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
1eef0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
1ef00 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1ef10 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
1ef20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1ef30 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
1ef40 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
1ef50 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1ef60 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
1ef70 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
1ef80 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
1ef90 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1efa0 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
1efb0 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
1efc0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
1efd0 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
1efe0 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
1eff0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1f000 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1f010 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1f020 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1f030 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
1f040 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1f050 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
1f060 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
1f070 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
1f080 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1f090 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
1f0a0 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
1f0b0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
1f0c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f0d0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1f0e0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
1f0f0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f100 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1f110 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1f120 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
1f130 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1f140 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1f150 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1f160 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
1f170 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
1f180 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
1f190 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
1f1a0 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
1f1b0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
1f1c0 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
1f1d0 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
1f1e0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1f1f0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1f200 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
1f210 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
1f220 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
1f230 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
1f240 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
1f250 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
1f260 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
1f270 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
1f280 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
1f290 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
1f2a0 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
1f2b0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
1f2c0 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
1f2d0 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
1f2e0 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
1f2f0 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
1f300 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
1f310 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
1f320 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
1f330 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
1f340 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
1f350 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31  abToDel->nRef==1
1f360 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
1f370 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1f380 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1f390 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
1f3a0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
1f3b0 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
1f3c0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
1f3d0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
1f3e0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
1f3f0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
1f400 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
1f410 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
1f420 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
1f430 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
1f440 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1f450 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
1f460 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
1f470 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
1f480 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
1f490 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
1f4a0 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
1f4b0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1f4c0 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
1f4d0 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
1f4e0 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
1f4f0 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
1f500 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f510 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
1f520 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
1f530 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
1f540 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
1f550 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
1f560 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
1f570 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
1f580 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1f590 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
1f5a0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1f5b0 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
1f5c0 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
1f5d0 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
1f5e0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
1f5f0 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
1f600 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
1f610 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
1f620 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
1f630 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
1f640 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
1f650 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
1f660 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
1f670 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
1f680 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
1f690 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
1f6a0 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
1f6b0 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
1f6c0 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1f6d0 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
1f6e0 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
1f6f0 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
1f700 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
1f710 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
1f720 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
1f730 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
1f740 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
1f750 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1f760 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
1f770 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20      u8 jointype 
1f780 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63  = 0;.    pSubSrc
1f790 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20   = pSub->pSrc;  
1f7a0 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
1f7b0 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  e of subquery */
1f7c0 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70  .    nSubSrc = p
1f7d0 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f  SubSrc->nSrc;  /
1f7e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1f7f0 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52  s in subquery FR
1f800 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1f810 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d   pSrc = pParent-
1f820 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
1f830 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1f840 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
1f850 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
1f860 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f870 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a  Parent==p );  /*
1f880 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f   First time thro
1f890 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1f8a0 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d        jointype =
1f8b0 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74   pSubitem->joint
1f8c0 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ype;.    }else{.
1f8d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1f8e0 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20  arent!=p );  /* 
1f8f0 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  2nd and subseque
1f900 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68  nt times through
1f910 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1f920 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
1f930 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t->pSrc = sqlite
1f940 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1f950 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
1f960 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29     if( pSrc==0 )
1f970 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f980 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1f990 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ed );.        br
1f9a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f9b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   }..    /* The s
1f9c0 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73  ubquery uses a s
1f9d0 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68  ingle slot of th
1f9e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1f9f0 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a   the outer.    *
1fa00 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65  * query.  If the
1fa10 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f   subquery has mo
1fa20 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d  re than one elem
1fa30 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ent in its FROM 
1fa40 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74  clause,.    ** t
1fa50 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f  hen expand the o
1fa60 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61  uter query to ma
1fa70 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20  ke space for it 
1fa80 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d  to hold all elem
1fa90 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
1faa0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1fab0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70   **.    ** Examp
1fac0 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1fad0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
1fae0 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54  OM tabA, (SELECT
1faf0 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75   * FROM sub1, su
1fb00 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a  b2), tabB;.    *
1fb10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74  *.    ** The out
1fb20 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73  er query has 3 s
1fb30 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d  lots in its FROM
1fb40 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c   clause.  One sl
1fb50 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ot of the.    **
1fb60 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68   outer query (th
1fb70 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69  e middle slot) i
1fb80 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75  s used by the su
1fb90 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78  bquery.  The nex
1fba0 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f  t.    ** block o
1fbb0 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61  f code will expa
1fbc0 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79  nd the out query
1fbd0 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68   to 4 slots.  Th
1fbe0 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20  e middle.    ** 
1fbf0 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64  slot is expanded
1fc00 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e   to two slots in
1fc10 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73   order to make s
1fc20 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20  pace for the.   
1fc30 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1fc40 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1fc50 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1fc60 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
1fc70 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b  if( nSubSrc>1 ){
1fc80 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1fc90 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71  pSrc = pSrc = sq
1fca0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1fcb0 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53  rge(db, pSrc, nS
1fcc0 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29  ubSrc-1,iFrom+1)
1fcd0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
1fce0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1fcf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1fd00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fd10 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
1fd20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1fd30 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  rms from the sub
1fd40 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20  query into the. 
1fd50 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1fd60 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1fd70 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63  r(i=0; i<nSubSrc
1fd80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1fd90 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1fda0 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b  e(db, pSrc->a[i+
1fdb0 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a  iFrom].pUsing);.
1fdc0 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
1fdd0 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
1fde0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65  ->a[i];.      me
1fdf0 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61  mset(&pSubSrc->a
1fe00 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  [i], 0, sizeof(p
1fe10 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a  SubSrc->a[i]));.
1fe20 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e      }.    pSrc->
1fe30 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70  a[iFrom].jointyp
1fe40 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  e = jointype;.  
1fe50 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69  .    /* Now begi
1fe60 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73  n substituting s
1fe70 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73  ubquery result s
1fe80 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66  et expressions f
1fe90 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  or .    ** refer
1fea0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61  ences to the iPa
1feb0 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65  rent in the oute
1fec0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20  r query..    ** 
1fed0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1fee0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fef0 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31   SELECT a+5, b*1
1ff00 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  0 FROM (SELECT x
1ff10 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53  *3 AS a, y+10 AS
1ff20 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52   b FROM t1) WHER
1ff30 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20  E a>b;.    **   
1ff40 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \               
1ff50 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f        \_________
1ff60 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
1ff70 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20  ________/       
1ff80 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c     /.    **    \
1ff90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ffa0 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72  _____ outer quer
1ffb0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  y ______________
1ffc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1ffd0 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  /.    **.    ** 
1ffe0 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79  We look at every
1fff0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
20000 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20010 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77  nd every place w
20020 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22  e see.    ** "a"
20030 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
20040 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70  x*3" and every p
20050 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20  lace we see "b" 
20060 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79  we substitute "y
20070 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  +10"..    */.   
20080 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74   pList = pParent
20090 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f  ->pEList;.    fo
200a0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
200b0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
200c0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
200d0 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  i].zName==0 ){. 
200e0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
200f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
20100 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e  rDup(db, pList->
20110 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[i].zSpan);.   
20120 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
20130 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ote(zName);.    
20140 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
20150 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
20160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20170 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
20180 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
20190 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
201a0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
201b0 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
201c0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
201d0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
201e0 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
201f0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
20200 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20210 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
20220 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  pr(db, pParent->
20230 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74  pHaving, iParent
20240 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20250 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20260 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
20270 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69  .      /* At thi
20280 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e  s point, any non
20290 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f  -zero iOrderByCo
202a0 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  l values indicat
202b0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
202c0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c   ** ORDER BY col
202d0 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  umn expression i
202e0 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  s identical to t
202f0 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74  he iOrderByCol't
20300 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  h.      ** expre
20310 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62  ssion returned b
20320 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  y SELECT stateme
20330 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74  nt pSub. Since t
20340 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20  hese values.    
20350 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65    ** do not nece
20360 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f  ssarily correspo
20370 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e  nd to columns in
20380 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20390 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20  t pParent,.     
203a0 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65   ** zero them be
203b0 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67  fore transfering
203c0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
203d0 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ause..      **. 
203e0 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e       ** Not doin
203f0 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65  g this may cause
20400 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73   an error if a s
20410 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
20420 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  o this.      ** 
20430 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
20440 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63  s to flatten a c
20450 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
20460 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20  y into pParent. 
20470 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c       ** (the onl
20480 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68  y way this can h
20490 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20  appen is if the 
204a0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
204b0 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63  ry is.      ** c
204c0 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66  urrently part of
204d0 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65   pSub->pSrc). Se
204e0 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65  e ticket [d11a6e
204f0 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20  908f].  */.     
20500 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
20510 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
20520 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28  erBy;.      for(
20530 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
20540 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
20550 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
20560 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
20570 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  yCol = 0;.      
20580 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
20590 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
205a0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  y==0 );.      as
205b0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69  sert( pSub->pPri
205c0 6f 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  or==0 );.      p
205d0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
205e0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
205f0 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
20600 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 0;.    }else
20610 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f   if( pParent->pO
20620 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
20630 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
20640 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  , pParent->pOrde
20650 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  rBy, iParent, pS
20660 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
20670 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
20680 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20  >pWhere ){.     
20690 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
206a0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
206b0 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b->pWhere, 0);. 
206c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
206d0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
206e0 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65  }.    if( subque
206f0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
20700 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20710 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
20720 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
20730 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74  Having = pParent
20740 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
20750 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
20760 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  = pWhere;.      
20770 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20780 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
20790 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
207a0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
207b0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
207c0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
207d0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
207e0 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
207f0 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20  pHaving, .      
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20820 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
20830 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29  Sub->pHaving, 0)
20840 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20850 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70   pParent->pGroup
20860 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
20870 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79  Parent->pGroupBy
20880 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
20890 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  stDup(db, pSub->
208a0 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
208b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
208c0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
208d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
208e0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
208f0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
20900 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
20910 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
20920 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
20930 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
20940 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
20950 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
20960 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
20970 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
20980 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
20990 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
209a0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
209b0 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
209c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
209d0 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
209e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
209f0 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
20a00 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
20a10 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
20a20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
20a30 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
20a40 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
20a50 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
20a60 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
20a70 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
20a80 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
20a90 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
20aa0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
20ab0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
20ac0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
20ad0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
20ae0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
20af0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
20b00 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
20b10 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
20b20 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
20b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
20b40 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
20b50 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
20b60 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
20b70 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
20b80 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
20b90 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
20ba0 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
20bb0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
20bc0 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
20bd0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
20be0 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  00 ){.    sqlite
20bf0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 41 66  3DebugPrintf("Af
20c00 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
20c10 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
20c20 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
20c30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
20c40 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  dif..  return 1;
20c50 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
20c60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
20c70 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
20c80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20c90 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
20ca0 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65  .** Based on the
20cb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
20cc0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
20cd0 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
20ce0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
20cf0 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63  ument, this func
20d00 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
20d10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
20d20 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
20d30 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74  * the query cont
20d40 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67  ains just a sing
20d50 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  le aggregate fun
20d60 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74  ction,.**    * t
20d70 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
20d80 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ction is either 
20d90 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20  min() or max(), 
20da0 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  and.**    * the 
20db0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
20dc0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
20dd0 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
20de0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  alue..**.** If a
20df0 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
20e00 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57  are true, then W
20e10 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
20e20 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
20e30 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75  Y_MAX.** is retu
20e40 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69  rned as appropri
20e50 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69  ate. Also, *ppMi
20e60 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70  nMax is set to p
20e70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  oint to the .** 
20e80 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74  list of argument
20e90 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
20ea0 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65  aggregate before
20eb0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
20ec0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e  * Or, if the con
20ed0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  ditions above ar
20ee0 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69  e not met, *ppMi
20ef0 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30  nMax is set to 0
20f00 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   and.** WHERE_OR
20f10 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20  DERBY_NORMAL is 
20f20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
20f30 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
20f40 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  ry(AggInfo *pAgg
20f50 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a  Info, ExprList *
20f60 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
20f70 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
20f80 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
20f90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
20fa0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70  n value */..  *p
20fb0 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69  pMinMax = 0;.  i
20fc0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
20fd0 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70  nc==1 ){.    Exp
20fe0 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49  r *pExpr = pAggI
20ff0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45  nfo->aFunc[0].pE
21000 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74  xpr; /* Aggregat
21010 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
21020 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
21030 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
21040 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67  ist;      /* Arg
21050 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75  uments to agg fu
21060 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61  nction */..    a
21070 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
21080 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
21090 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  N );.    if( pEL
210a0 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
210b0 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
210c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
210d0 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
210e0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
210f0 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45  char *zFunc = pE
21100 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
21110 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21120 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
21130 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
21140 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
21150 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
21160 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
21170 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
21180 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
21190 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
211a0 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
211b0 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
211c0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
211d0 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
211e0 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
211f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21200 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
21210 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d  x==0 || (*ppMinM
21220 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ax)->nExpr==1 );
21230 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a  .  return eRet;.
21240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
21250 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
21260 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
21270 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
21280 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
21290 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
212a0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
212b0 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
212c0 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
212d0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
212e0 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
212f0 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
21300 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
21310 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
21320 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
21330 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
21340 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
21350 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
21360 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
21370 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
21380 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
21390 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
213a0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
213b0 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
213c0 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
213d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
213e0 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
213f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
21400 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
21410 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
21420 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
21430 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
21440 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
21450 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
21460 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
21470 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
21480 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
21490 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
214a0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
214b0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
214c0 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
214d0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
214e0 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
214f0 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
21500 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
21510 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
21520 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
21530 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
21540 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
21550 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
21560 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21570 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
21580 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
21590 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
215a0 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  ER(pAggInfo->nFu
215b0 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  nc==0) ) return 
215c0 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
215d0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
215e0 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51  nc->funcFlags&SQ
215f0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
21600 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21610 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
21620 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
21630 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
21640 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
21650 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
21660 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
21670 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
21680 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
21690 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
216a0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
216b0 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
216c0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
216d0 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
216e0 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
216f0 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
21700 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
21710 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
21720 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
21730 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
21740 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
21750 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
21760 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
21770 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
21780 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
21790 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
217a0 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
217b0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
217c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
217d0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
217e0 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
217f0 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54  >zIndex ){.    T
21800 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
21810 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
21820 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72  ar *zIndex = pFr
21830 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20  om->zIndex;.    
21840 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
21850 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
21860 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
21870 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
21880 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
21890 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20  ame, zIndex); . 
218a0 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
218b0 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
218c0 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
218d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
218e0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
218f0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
21900 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
21910 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
21920 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
21930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21940 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
21950 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78     pFrom->pIndex
21960 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
21970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21980 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
21990 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
219a0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
219b0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
219c0 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
219d0 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
219e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
219f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
21a00 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
21a10 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
21a20 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
21a30 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
21a40 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
21a50 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
21a60 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
21a70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21a80 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
21a90 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
21aa0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
21ab0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
21ac0 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
21ad0 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
21ae0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
21af0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
21b00 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
21b10 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
21b20 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
21b30 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
21b40 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
21b50 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
21b60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
21b70 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
21b80 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
21b90 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
21ba0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
21bb0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
21bc0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
21bd0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
21be0 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
21bf0 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
21c00 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
21c10 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
21c20 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
21c30 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
21c40 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
21c50 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
21c60 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
21c70 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
21c80 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
21c90 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
21ca0 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
21cb0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
21cc0 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
21cd0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
21ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
21cf0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
21d00 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
21d10 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
21d20 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
21d30 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
21d40 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
21d50 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
21d60 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
21d70 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
21d80 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
21d90 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
21da0 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
21db0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
21dc0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
21dd0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
21de0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
21df0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
21e00 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
21e10 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
21e20 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
21e30 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
21e40 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
21e50 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
21e60 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
21e70 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
21e80 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
21e90 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
21ea0 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
21eb0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
21ec0 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
21ed0 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
21ee0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
21ef0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
21f00 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
21f10 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
21f20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
21f30 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
21f40 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
21f50 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
21f60 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
21f70 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
21f80 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
21f90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
21fa0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
21fb0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
21fc0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
21fd0 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
21fe0 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
21ff0 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
22000 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
22010 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
22020 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
22030 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
22040 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
22050 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
22060 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
22070 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
22080 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
22090 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
220a0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
220b0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
220c0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
220d0 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  LL, 0));.  p->op
220e0 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
220f0 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
22100 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
22110 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
22120 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
22130 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
22140 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
22150 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  .  p->pNext = 0;
22160 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b  .  p->pWith = 0;
22170 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  .  p->selFlags &
22180 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
22190 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
221a0 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
221b0 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70  erted)==0 );.  p
221c0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
221d0 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73  _Converted;.  as
221e0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69  sert( pNew->pPri
221f0 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d  or!=0 );.  pNew-
22200 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
22210 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70   pNew;.  pNew->p
22220 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
22230 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->pOffset = 0;.
22240 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
22250 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  tinue;.}..#ifnde
22260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
22270 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  E./*.** Argument
22280 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61   pWith (which ma
22290 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74  y be NULL) point
222a0 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69  s to a linked li
222b0 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a  st of nested .**
222c0 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20   WITH contexts, 
222d0 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75  from inner to ou
222e0 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20  termost. If the 
222f0 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64  table identified
22300 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   by .** FROM cla
22310 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65  use element pIte
22320 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f  m is really a co
22330 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65  mmon-table-expre
22340 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20  ssion (CTE) .** 
22350 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
22360 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45  inter to the CTE
22370 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20   definition for 
22380 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65  that table. Othe
22390 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20  rwise.** return 
223a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
223b0 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
223c0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74  is returned, set
223d0 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70   *ppContext to p
223e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68  oint to the With
223f0 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20  .** object that 
22400 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45  the returned CTE
22410 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a   belongs to..*/.
22420 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74  static struct Ct
22430 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20  e *searchWith(. 
22440 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65   /* Current oute
22470 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  rmost WITH claus
22480 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
22490 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
224a0 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  m,     /* FROM c
224b0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f  lause element to
224c0 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69   resolve */.  Wi
224d0 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20  th **ppContext  
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
224f0 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73   OUT: WITH claus
22500 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62  e return value b
22510 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a  elongs to */.){.
22520 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
22530 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ame;.  if( pItem
22540 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26  ->zDatabase==0 &
22550 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d  & (zName = pItem
22560 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ->zName)!=0 ){. 
22570 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20     With *p;.    
22580 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20  for(p=pWith; p; 
22590 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20  p=p->pOuter){.  
225a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
225b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
225c0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
225d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
225e0 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e  rICmp(zName, p->
225f0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
22600 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43  {.          *ppC
22610 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  ontext = p;.    
22620 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
22630 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
22640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22650 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22660 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
22670 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
22680 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
22690 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
226a0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
226b0 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
226c0 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
226d0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
226e0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
226f0 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65  utine pushes the
22700 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73   WITH clause pas
22710 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
22720 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e  d argument.** on
22730 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  to the top of th
22740 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75  e stack. If argu
22750 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72  ment bFree is tr
22760 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ue, then this.**
22770 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c   WITH clause wil
22780 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65  l never be poppe
22790 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
227a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
227b0 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
227c0 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
227d0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
227e0 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73  . In other cases
227f0 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d  , when.** bFree=
22800 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a  =0, the With obj
22810 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ect will be free
22820 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
22830 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74   SELECT .** stat
22840 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68  ement with which
22850 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65   it is associate
22860 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
22870 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65  e3WithPush(Parse
22880 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a   *pParse, With *
22890 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29  pWith, u8 bFree)
228a0 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65  {.  assert( bFre
228b0 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  e==0 || pParse->
228c0 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66  pWith==0 );.  if
228d0 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70  ( pWith ){.    p
228e0 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70  With->pOuter = p
228f0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
22900 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
22910 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  = pWith;.    pPa
22920 72 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d  rse->bFreeWith =
22930 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f   bFree;.  }.}../
22940 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22950 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
22960 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
22970 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
22980 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
22990 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
229a0 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
229b0 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
229c0 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
229d0 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
229e0 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
229f0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
22a00 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
22a10 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
22a20 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
22a30 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
22a40 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
22a50 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
22a60 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
22a70 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
22a80 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
22a90 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
22aa0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
22ab0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
22ac0 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
22ad0 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
22ae0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
22af0 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
22b00 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
22b10 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
22b20 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
22b30 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
22b40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22b50 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
22b60 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
22b70 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
22b80 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
22b90 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
22ba0 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
22bb0 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
22bc0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
22bd0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
22be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
22bf0 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
22c00 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
22c10 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22c20 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
22c30 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
22c40 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
22c50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22c60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
22c70 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c90 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
22ca0 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
22cb0 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
22cc0 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
22cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
22ce0 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
22cf0 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
22d00 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
22d10 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
22d20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
22d30 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
22d40 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
22d50 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
22d60 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
22d70 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
22d80 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
22d90 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
22da0 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
22db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
22dc0 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
22dd0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
22de0 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
22df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
22e00 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
22e10 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
22e20 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
22e30 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
22e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22e50 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
22e60 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
22e70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
22e80 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55  ->zErr is non-NU
22e90 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
22ea0 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  , then this is a
22eb0 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a  n illegal.    **
22ec0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
22ed0 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65  ence to CTE pCte
22ee0 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  . Leave an error
22ef0 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
22f00 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72  eturn.    ** ear
22f10 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72  ly. If pCte->zEr
22f20 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
22f30 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
22f40 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
22f50 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
22f60 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
22f70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
22f80 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  e->zErr ){.     
22f90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22fa0 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
22fb0 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
22fc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22fd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22fe0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
22ff0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
23000 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
23010 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
23020 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23030 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
23040 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
23050 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23060 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
23070 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
23080 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
23090 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
230a0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
230b0 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
230c0 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e  = -1;.    pTab->
230d0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
230e0 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
230f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
23100 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61  8576) );.    pTa
23110 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
23120 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  F_Ephemeral;.   
23130 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
23140 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
23150 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  up(db, pCte->pSe
23160 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
23170 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
23180 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
23190 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73  TE_NOMEM;.    as
231a0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
231b0 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
231c0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
231d0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
231e0 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
231f0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
23200 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
23210 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
23220 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
23230 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
23240 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
23250 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
23260 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
23270 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
23280 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
23290 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
232a0 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
232b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
232c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
232d0 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
232e0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
232f0 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
23300 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
23310 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
23320 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
23330 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
23340 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
23350 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
23360 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
23370 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
23380 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
23390 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75     pItem->isRecu
233a0 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20  rsive = 1;.     
233b0 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
233c0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  +;.          pSe
233d0 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  l->selFlags |= S
233e0 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
233f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23400 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
23410 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20  y one recursive 
23420 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72  reference is per
23430 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20  mitted. */ .    
23440 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32  if( pTab->nRef>2
23450 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23460 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
23470 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
23480 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
23490 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
234a0 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
234b0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
234c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
234d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
234e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
234f0 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28  b->nRef==1 || ((
23500 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
23510 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
23520 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29  pTab->nRef==2 ))
23530 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72  ;..    pCte->zEr
23540 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
23550 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
23560 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
23570 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
23580 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
23590 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c  = pWith;.    sql
235a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
235b0 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75  Walker, bMayRecu
235c0 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50  rsive ? pSel->pP
235d0 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20  rior : pSel);.. 
235e0 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
235f0 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
23600 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
23610 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
23620 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
23630 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
23640 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
23650 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
23660 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
23670 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
23680 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23690 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
236a0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
236b0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
236c0 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
236d0 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
236e0 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
236f0 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
23700 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
23710 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
23720 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
23730 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
23740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23750 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
23760 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
23770 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
23780 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73     selectColumns
23790 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
237a0 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
237b0 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
237c0 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
237d0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
237e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
237f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
23800 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
23810 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
23820 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72   "multiple recur
23830 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a  sive references:
23840 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73   %s";.      }els
23850 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  e{.        pCte-
23860 3e 7a 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  >zErr = "recursi
23870 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
23880 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
23890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
238a0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
238b0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
238c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
238d0 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  >zErr = 0;.    p
238e0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
238f0 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a  SavedWith;.  }..
23900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23910 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
23920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23930 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74  T_CTE./*.** If t
23940 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64  he SELECT passed
23950 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
23960 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61  rgument has an a
23970 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a  ssociated WITH .
23980 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69  ** clause, pop i
23990 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  t from the stack
239a0 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
239b0 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  of the Parse obj
239c0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
239d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
239e0 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43   as the xSelectC
239f0 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62  allback2() callb
23a00 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65  ack by.** sqlite
23a10 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
23a20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53  when walking a S
23a30 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65  ELECT tree to re
23a40 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  solve table.** n
23a50 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46  ames and other F
23a60 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
23a70 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  nts. .*/.static 
23a80 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69  void selectPopWi
23a90 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  th(Walker *pWalk
23aa0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
23ab0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
23ac0 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
23ad0 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  e;.  With *pWith
23ae0 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
23af0 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66  (p)->pWith;.  if
23b00 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20  ( pWith!=0 ){.  
23b10 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
23b20 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
23b30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
23b40 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
23b50 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  ter;.  }.}.#else
23b60 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50  .#define selectP
23b70 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a  opWith 0.#endif.
23b80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23b90 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
23ba0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
23bb0 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
23bc0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
23bd0 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
23be0 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
23bf0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
23c00 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
23c10 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
23c20 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
23c30 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
23c40 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
23c50 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23c60 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
23c70 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
23c80 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
23c90 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
23ca0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
23cb0 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
23cc0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
23cd0 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
23ce0 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
23cf0 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
23d00 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
23d10 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
23d20 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
23d30 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
23d40 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
23d50 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
23d60 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
23d70 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
23d80 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
23d90 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
23da0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
23db0 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
23dc0 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
23dd0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
23de0 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
23df0 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
23e00 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  p the persistent
23e10 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
23e20 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
23e30 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
23e40 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
23e50 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
23e60 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61  use to accommoda
23e70 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  te the NATURAL k
23e80 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20  eyword.**       
23e90 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74    on joins and t
23ea0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
23eb0 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e  clause of joins.
23ec0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53  .**.**    (4)  S
23ed0 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  can the list of 
23ee0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
23ef0 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73  esult set (pELis
23f00 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20  t) looking.**   
23f10 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e        for instan
23f20 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f  ces of the "*" o
23f30 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54  perator or the T
23f40 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e  ABLE.* operator.
23f50 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66  .**         If f
23f60 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63  ound, expand eac
23f70 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72  h "*" to be ever
23f80 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72  y column in ever
23f90 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  y table.**      
23fa0 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74     and TABLE.* t
23fb0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
23fc0 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a  n in TABLE..**.*
23fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
23fe0 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b  ectExpander(Walk
23ff0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
24000 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
24010 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
24020 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e  er->pParse;.  in
24030 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63  t i, j, k;.  Src
24040 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
24050 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
24060 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
24070 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
24080 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
24090 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
240a0 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68  Expr *pE, *pRigh
240b0 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36  t, *pExpr;.  u16
240c0 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73   selFlags = p->s
240d0 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73  elFlags;..  p->s
240e0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
240f0 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
24100 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
24110 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
24120 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
24130 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63  f( NEVER(p->pSrc
24140 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67  ==0) || (selFlag
24150 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
24160 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
24170 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
24180 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
24190 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
241a0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
241b0 66 28 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c  f( pWalker->xSel
241c0 65 63 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65  ectCallback2==se
241d0 6c 65 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20  lectPopWith ){. 
241e0 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75     sqlite3WithPu
241f0 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52  sh(pParse, findR
24200 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
24210 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  th, 0);.  }..  /
24220 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
24230 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
24240 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
24250 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
24260 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
24270 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
24280 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
24290 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
242a0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
242b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
242c0 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
242d0 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
242e0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
242f0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
24300 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
24310 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
24320 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
24330 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
24340 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
24350 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
24360 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
24370 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
24380 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
24390 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
243a0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
243b0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
243c0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
243d0 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
243e0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
243f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
24400 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d  om->isRecursive=
24410 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
24420 62 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  b );.    if( pFr
24430 6f 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20  om->isRecursive 
24440 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24450 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
24460 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
24470 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
24480 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
24490 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
244a0 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
244b0 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
244c0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
244d0 72 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e  rt( i==0 );.#ifn
244e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
244f0 43 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74  CTE.      select
24500 50 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c  PopWith(pWalker,
24510 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   p);.#endif.    
24520 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
24530 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ne;.    }.#ifnde
24540 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
24550 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
24560 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
24570 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
24580 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
24590 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
245a0 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
245b0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
245c0 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
245d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
245e0 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
245f0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
24600 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
24610 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
24620 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
24630 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
24640 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
24650 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
24660 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
24670 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
24680 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
24690 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
246a0 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
246b0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
246c0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
246d0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
246e0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
246f0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
24700 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
24710 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24720 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
24730 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
24740 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
24750 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
24760 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
24770 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
24780 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
24790 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
247a0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
247b0 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f  }.      selectCo
247c0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
247d0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
247e0 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
247f0 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
24800 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
24810 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
24820 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
24830 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
24840 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
24850 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
24860 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
24870 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
24880 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
24890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
248a0 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
248b0 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
248c0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
248d0 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
248e0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
248f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
24900 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
24910 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
24920 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
24930 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
24940 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
24950 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
24960 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
24970 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29 7b  >nRef==0xffff ){
24980 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
249a0 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72   "too many refer
249b0 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a  ences to \"%s\":
249c0 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20   max 65535",.   
249d0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
249e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ame);.        pF
249f0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  rom->pTab = 0;. 
24a00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
24a10 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
24a20 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
24a30 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
24a40 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
24a50 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
24a60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
24a70 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
24a80 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
24a90 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
24aa0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
24ab0 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
24ac0 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
24ad0 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
24ae0 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
24af0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
24b00 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
24b10 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
24b20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24b30 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
24b40 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  t( pFrom->pSelec
24b50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
24b60 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
24b70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
24b80 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c  p(db, pTab->pSel
24b90 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
24ba0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
24bb0 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65  tName(pFrom->pSe
24bc0 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lect, pTab->zNam
24bd0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
24be0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
24bf0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
24c00 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
24c10 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
24c20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
24c30 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
24c40 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
24c50 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
24c60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
24c70 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
24c80 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
24c90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
24ca0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
24cb0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
24cc0 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
24cd0 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
24ce0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
24cf0 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
24d00 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24d10 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
24d20 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
24d30 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
24d40 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
24d50 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
24d60 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
24d70 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
24d80 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
24d90 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
24da0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
24db0 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
24dc0 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
24dd0 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
24de0 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
24df0 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
24e00 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
24e10 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
24e20 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
24e30 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
24e40 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
24e50 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
24e60 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
24e70 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
24e80 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
24e90 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
24ea0 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
24eb0 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
24ec0 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
24ed0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
24ee0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
24ef0 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
24f00 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
24f10 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
24f20 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
24f30 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
24f40 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
24f50 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
24f60 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
24f70 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
24f80 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
24f90 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
24fa0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
24fb0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
24fc0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
24fd0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
24fe0 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
24ff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
25000 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
25010 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26  (pE->pLeft!=0 &&
25020 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d   pE->pLeft->op==
25030 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66  TK_ID) );.    if
25040 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
25050 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e   && pE->pRight->
25060 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
25070 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  ak;.  }.  if( k<
25080 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
25090 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
250a0 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
250b0 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
250c0 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
250d0 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
250e0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
250f0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
25100 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
25110 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
25120 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
25130 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
25140 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
25150 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
25160 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
25170 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
25180 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
25190 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
251a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
251b0 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
251c0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
251d0 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
251e0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
251f0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
25220 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
25230 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a  mes)==0;..    /*
25240 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
25250 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
25260 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20 61  queries, it is a
25270 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
25280 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c 5f     ** that full_
25290 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46  column_names=OFF
252a0 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75 6d   and short_colum
252b0 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68 65  n_names=ON.  The
252c0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52  .    ** sqlite3R
252d0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
252e0 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  () routine makes
252f0 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20 61   it so. */.    a
25300 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
25310 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
25320 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  rom)==0.        
25330 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20 53    || ((flags & S
25340 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
25350 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  es)==0 &&.      
25360 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20 26          (flags &
25370 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
25380 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a 20  Names)!=0) );.. 
25390 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
253a0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
253b0 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b  ){.      pE = a[
253c0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  k].pExpr;.      
253d0 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69  pRight = pE->pRi
253e0 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
253f0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
25400 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29  T || pRight!=0 )
25410 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
25420 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70  op!=TK_ALL && (p
25430 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
25440 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f   pRight->op!=TK_
25450 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
25460 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
25470 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
25480 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
25490 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
254a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
254b0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
254c0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
254d0 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
254e0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
254f0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
25500 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
25510 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
25520 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
25530 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
25540 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
25550 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
25560 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
25570 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
25580 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
25590 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
255a0 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
255b0 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
255c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
255d0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
255e0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
255f0 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
25600 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
25610 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
25620 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
25630 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
25640 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
25650 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
25660 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
25670 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
25680 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
25690 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
256a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
256b0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
256c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
256d0 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
256e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
256f0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
25700 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
25710 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
25720 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
25730 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
25740 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
25750 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
25760 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
25770 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
25780 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
25790 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
257a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
257b0 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
257c0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
257d0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
257e0 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
257f0 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
25800 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
25810 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
25820 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
25830 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
25840 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
25850 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
25860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
25870 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
25880 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
25890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
258a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
258b0 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
258c0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
258d0 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
258e0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
258f0 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
25900 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
25910 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
25920 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
25930 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
25940 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
25950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25960 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
25970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25980 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
25990 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
259a0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
259b0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
259c0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
259d0 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
259e0 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22  iDb].zName : "*"
259f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25a00 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
25a10 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
25a20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
25a30 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
25a40 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
25a50 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
25a60 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20  char *zColname; 
25a70 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64   /* The computed
25a80 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
25a90 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
25aa0 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20   *zToFree;   /* 
25ab0 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20  Malloced string 
25ac0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
25ad0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20   freed */.      
25ae0 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c        Token sCol
25af0 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74  name;  /* Comput
25b00 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  ed column name a
25b10 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20  s a token */..  
25b20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25b30 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20  ( zName );.     
25b40 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
25b50 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20  e && pSub.      
25b60 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
25b70 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70  3MatchSpanName(p
25b80 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
25b90 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61  ].zSpan, 0, zTNa
25ba0 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  me, 0)==0.      
25bb0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25bc0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
25bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
25be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25bf0 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
25c00 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
25c10 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
25c20 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
25c30 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
25c40 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
25c50 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
25c60 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
25c70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
25c80 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
25c90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
25ca0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
25cb0 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
25cc0 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
25cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
25ce0 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
25cf0 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
25d00 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
25d10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25d20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
25d30 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
25d40 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
25d50 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
25d60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25d70 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pFrom->jointype
25d80 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
25d90 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
25da0 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
25db0 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
25dc0 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
25dd0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
25de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25df0 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
25e00 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
25e10 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
25e20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
25e30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
25e40 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
25e50 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
25e70 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25e90 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
25ea0 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
25eb0 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
25ec0 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
25ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
25ee0 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
25ef0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
25f00 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
25f30 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
25f40 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25f90 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
25fa0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
25fb0 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
25fc0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
25fd0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
25fe0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
25ff0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
26000 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
26010 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
26020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26030 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
26050 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
26060 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
26070 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
26080 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
26090 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
260a0 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
260b0 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
260c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
260d0 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
260f0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
26100 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
26110 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
26120 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
26130 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
26140 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
26150 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30 29  pLeft, pExpr, 0)
26160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26170 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
26180 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
26190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
261a0 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
261b0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
261c0 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
261d0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
261e0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
261f0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
26200 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26210 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
26230 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
26240 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26250 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
26260 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
26270 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
26280 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
26290 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
262a0 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
262b0 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
262c0 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
262d0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
262e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
262f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
26300 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
26310 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
26320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
26330 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
26340 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
26350 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
26370 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
26380 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
26390 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
263a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
263b0 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
263c0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
263d0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
263e0 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
263f0 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
26400 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
26410 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26420 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
26440 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26450 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
26460 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26470 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 7a 53 63 68 65             zSche
264b0 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
264c0 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
264e0 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
264f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
26500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26510 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
26520 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
26530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26540 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26550 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
26560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26580 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
26590 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
265a0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
265b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
265c0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
265d0 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
265e0 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
265f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26600 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26610 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
26620 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
26630 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
26640 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
26660 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
26670 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
26680 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
26690 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
266a0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
266b0 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
266c0 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
266d0 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
266e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
266f0 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
26700 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26710 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
26720 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
26730 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  set");.  }.#endi
26740 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
26750 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
26760 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
26770 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
26780 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
26790 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
267a0 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
267b0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
267c0 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
267d0 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
267e0 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
267f0 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
26800 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
26810 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
26820 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
26830 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
26840 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
26850 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
26860 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
26870 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
26880 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
26890 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
268a0 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
268b0 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
268c0 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 57  static int exprW
268d0 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
268e0 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
268f0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
26900 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
26910 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
26920 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
26930 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
26940 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
26950 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
26960 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
26970 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
26980 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
26990 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
269a0 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
269b0 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
269c0 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
269d0 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
269e0 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
269f0 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
26a00 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
26a10 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
26a20 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
26a30 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
26a40 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
26a50 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
26a60 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
26a70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
26a80 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
26a90 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
26aa0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
26ab0 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
26ac0 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
26ad0 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
26ae0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
26af0 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
26b00 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
26b10 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
26b20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
26b30 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
26b40 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
26b50 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
26b60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26b80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
26b90 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
26ba0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
26bb0 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
26bc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
26bd0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
26be0 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
26bf0 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  = exprWalkNoop;.
26c00 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
26c10 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rse;.  if( pPars
26c20 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29  e->hasCompound )
26c30 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
26c40 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
26c50 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
26c60 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 73  oSubquery;.    s
26c70 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
26c80 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (&w, pSelect);. 
26c90 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61   }.  w.xSelectCa
26ca0 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45  llback = selectE
26cb0 78 70 61 6e 64 65 72 3b 0a 20 20 69 66 28 20 28  xpander;.  if( (
26cc0 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
26cd0 73 20 26 20 53 46 5f 41 6c 6c 56 61 6c 75 65 73  s & SF_AllValues
26ce0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 2e 78 53  )==0 ){.    w.xS
26cf0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
26d00 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
26d10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 57 61 6c    }.  sqlite3Wal
26d20 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
26d30 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
26d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
26d50 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
26d60 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
26d70 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
26d80 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
26d90 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
26da0 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
26db0 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
26dc0 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
26dd0 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
26de0 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
26df0 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
26e00 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
26e10 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
26e20 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
26e30 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
26e40 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
26e50 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
26e60 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
26e70 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
26e80 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
26e90 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
26ea0 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
26eb0 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
26ec0 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
26ed0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
26ee0 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
26ef0 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
26f00 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
26f10 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
26f20 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
26f30 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
26f40 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
26f50 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
26f60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26f70 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
26f80 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
26f90 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
26fa0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
26fb0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
26fc0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
26fd0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
26fe0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
26ff0 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
27000 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27010 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66  Resolved );.  if
27020 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
27030 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29   SF_HasTypeInfo)
27040 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  ==0 ){.    p->se
27050 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
27060 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50  TypeInfo;.    pP
27070 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
27080 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62  pParse;.    pTab
27090 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
270a0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
270b0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
270c0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
270d0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
270e0 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
270f0 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
27100 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
27110 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28  YS(pTab!=0) && (
27120 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
27130 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
27140 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
27150 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
27160 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
27170 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
27180 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
27190 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
271a0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ect;.        if(
271b0 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
271c0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
271d0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
271e0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
271f0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64          selectAd
27200 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
27210 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
27220 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
27230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27240 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
27250 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
27260 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
27270 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
27280 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
27290 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
272a0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
272b0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
272c0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
272d0 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
272e0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
272f0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
27300 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
27310 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
27320 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
27330 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
27340 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
27350 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
27360 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
27370 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
27380 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
27390 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
273a0 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65  f(w));.  w.xSele
273b0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
273c0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
273d0 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
273e0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
273f0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
27400 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
27410 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
27420 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
27430 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
27440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27450 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
27460 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
27470 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
27480 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
27490 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
274a0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
274b0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
274c0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
274d0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
274e0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
274f0 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
27500 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
27510 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
27520 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
27530 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
27540 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
27550 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
27560 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
27570 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
27580 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
27590 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
275a0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
275b0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
275c0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
275d0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
275e0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
275f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
27600 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
27610 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
27620 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
27630 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
27640 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
27650 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
27660 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
27670 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
27680 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
27690 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
276a0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
276b0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
276c0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
276d0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
276e0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
276f0 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
27700 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27710 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
27720 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
27730 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
27740 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
27750 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
27760 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
27770 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
27780 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
27790 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
277a0 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
277b0 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
277c0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
277d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
277e0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
277f0 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
27800 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
27810 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
27820 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
27830 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
27840 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
27850 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
27860 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
27870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
27880 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
27890 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
278a0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
278b0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
278c0 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
278d0 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
278e0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
278f0 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
27900 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
27910 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
27920 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
27930 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
27940 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
27950 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
27960 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
27970 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
27980 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
27990 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
279a0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
279b0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
279c0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
279d0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
279e0 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
279f0 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
27a00 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
27a10 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
27a20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
27a30 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
27a40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
27a50 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
27a60 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
27a70 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
27a80 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
27a90 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
27aa0 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
27ab0 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
27ac0 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
27ad0 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
27ae0 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
27af0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
27b00 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
27b10 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
27b20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
27b30 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
27b40 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
27b50 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
27b60 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
27b70 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
27b80 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
27b90 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
27ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
27bb0 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
27bc0 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
27bd0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
27be0 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
27bf0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
27c00 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
27c10 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
27c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27c30 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
27c40 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
27c50 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
27c60 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
27c70 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
27c80 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
27c90 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
27ca0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
27cb0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
27cc0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
27cd0 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
27ce0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
27cf0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
27d00 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
27d10 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
27d20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
27d30 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
27d40 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
27d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27d60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
27d70 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
27d80 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
27d90 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
27da0 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
27db0 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
27dc0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
27dd0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
27de0 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
27df0 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
27e00 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
27e10 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
27e20 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
27e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27e40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
27e50 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
27e60 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
27e70 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
27e90 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
27ea0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
27eb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
27ec0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
27ed0 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
27ee0 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
27ef0 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
27f00 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
27f10 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
27f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27f30 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
27f40 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
27f50 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
27f60 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
27f70 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
27f80 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
27f90 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
27fa0 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
27fb0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
27fc0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
27fd0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
27fe0 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
27ff0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
28000 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
28010 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
28020 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
28030 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
28040 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
28050 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
28060 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
28070 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
28080 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
28090 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
280a0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
280b0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
280c0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
280d0 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
280e0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
280f0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
28100 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
28110 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
28120 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
28130 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
28140 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
28150 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
28160 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
28170 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
28180 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
28190 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
281a0 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a  int regHit = 0;.
281b0 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73    int addrHitTes
281c0 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
281d0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
281e0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
281f0 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70  fo_col *pC;..  p
28200 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
28210 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  ode = 1;.  for(i
28220 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d  =0, pF=pAggInfo-
28230 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e  >aFunc; i<pAggIn
28240 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
28250 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  pF++){.    int n
28260 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  Arg;.    int add
28270 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69  rNext = 0;.    i
28280 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45  nt regAgg;.    E
28290 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
282a0 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
282b0 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
282c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
282d0 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
282e0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
282f0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
28300 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
28310 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
28320 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
28330 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
28340 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
28350 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
28360 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
28370 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
28380 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50   SQLITE_ECEL_DUP
28390 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
283a0 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
283b0 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
283c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
283d0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
283e0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
283f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28400 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
28410 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
28420 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
28430 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
28440 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
28450 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
28460 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
28470 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
28480 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
28490 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
284a0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
284b0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
284c0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
284d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
284e0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
284f0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
28500 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
28510 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
28520 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
28530 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
28540 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
28550 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
28560 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
28570 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
28580 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
28590 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
285a0 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
285b0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
285c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
285d0 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
285e0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
285f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
28600 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
28610 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
28620 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
28630 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
28640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28650 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
28660 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
28670 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
28680 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
28690 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
286a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
286b0 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
286c0 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
286f0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
28700 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
28710 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
28720 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
28730 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
28740 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
28750 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
28760 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
28770 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
28780 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
28790 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
287a0 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
287b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
287c0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
287d0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
287e0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
287f0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
28800 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
28810 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
28820 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
28830 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
28840 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
28850 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
28860 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
28870 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
28880 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
28890 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
288a0 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
288b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
288c0 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
288d0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
288e0 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
288f0 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
28900 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
28910 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
28920 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
28930 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
28940 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
28950 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
28960 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
28970 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
28980 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
28990 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
289a0 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
289b0 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
289c0 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
289d0 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
289e0 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
289f0 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
28a00 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
28a10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
28a20 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
28a30 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
28a40 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
28a50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
28a60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
28a70 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
28a80 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
28a90 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
28aa0 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
28ab0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
28ac0 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
28ad0 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
28ae0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
28af0 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
28b00 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
28b10 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
28b20 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
28b30 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
28b40 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
28b50 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
28b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
28b70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
28b80 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
28b90 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
28ba0 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
28bb0 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
28bc0 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
28bd0 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
28be0 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
28bf0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
28c00 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
28c10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28c20 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
28c30 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
28c40 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
28c50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
28c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28c70 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
28c80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
28cb0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
28cc0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ce0 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
28cf0 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
28d00 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
28d10 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
28d20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
28d30 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
28d40 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
28d50 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
28d60 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
28d70 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
28d80 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
28d90 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
28da0 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
28db0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
28dc0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
28dd0 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
28de0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
28df0 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
28e00 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
28e10 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
28e20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28e30 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
28e40 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
28e50 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
28e60 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
28e70 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
28e80 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
28e90 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
28ea0 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
28eb0 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
28ec0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
28ed0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
28ee0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28ef0 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
28f00 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
28f10 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
28f20 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
28f30 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
28f40 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
28f50 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
28f60 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
28f70 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
28f80 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
28f90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
28fa0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
28fb0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
28fc0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
28fd0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
28fe0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
28ff0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
29000 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
29010 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
29020 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29030 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
29040 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
29050 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
29060 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
29070 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
29080 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
29090 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
290a0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
290b0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
290c0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
290d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
290f0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
29100 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
29110 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
29120 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
29130 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
29140 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
29150 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
29160 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
29170 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29180 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
29190 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
291a0 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
291b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
291c0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
291e0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
291f0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
29200 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
29210 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
29220 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
29230 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
29240 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
29250 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
29260 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
29270 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
29280 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
29290 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
292a0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
292b0 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
292c0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
292d0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
292e0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
292f0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29300 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
29310 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
29320 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
29330 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
29340 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
29350 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
29360 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
29370 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
29380 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
29390 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
293a0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
293b0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
293c0 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
293d0 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
293e0 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
293f0 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
29400 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
29410 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
29420 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
29430 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
29440 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
29450 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
29460 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
29470 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
29480 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
29490 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
294a0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
294b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
294c0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
294d0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
294e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
294f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
29500 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
29510 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
29520 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
29530 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
29540 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
29550 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
29560 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
29570 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
29580 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
29590 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
295a0 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
295b0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
295c0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
295d0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
295e0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
295f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
29600 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
29610 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
29620 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
29630 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
29640 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
29650 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
29660 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
29670 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
29680 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
29690 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
296a0 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
296b0 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
296c0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
296d0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
296e0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
296f0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
29700 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
29710 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
29720 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
29730 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
29740 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
29750 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29760 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
29770 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
29780 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
29790 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
297a0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
297b0 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
297c0 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
297d0 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
297e0 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
297f0 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
29800 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
29810 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
29820 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
29830 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
29840 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
29850 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
29860 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
29870 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
29880 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
29890 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
298a0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
298b0 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
298c0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
298d0 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
298e0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
298f0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
29900 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
29910 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
29920 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
29930 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
29940 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
29950 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
29960 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
29970 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
29980 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
29990 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
299a0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
299b0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
299c0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
299d0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
299e0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
299f0 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
29a00 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
29a10 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
29a20 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
29a30 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
29a40 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
29a50 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
29a60 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
29a70 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
29a80 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
29a90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29aa0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
29ab0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
29ac0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
29ad0 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d   }.  isAgg = (p-
29ae0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
29af0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
29b00 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
29b10 30 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  0 );.#if SELECTT
29b20 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
29b30 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
29b40 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
29b50 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
29b60 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
29b70 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65   ("after name re
29b80 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  solution:\n"));.
29b90 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
29ba0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
29bb0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
29bc0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
29bd0 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a  rating code..  *
29be0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
29bf0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
29c00 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
29c10 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
29c20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
29c30 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
29c40 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
29c50 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
29c60 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
29c70 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
29c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29c90 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
29ca0 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
29cb0 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
29cc0 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
29cd0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
29ce0 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
29cf0 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
29d00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
29d10 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
29d20 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
29d30 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69  M clause.  */.#i
29d40 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
29d50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
29d60 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
29d70 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
29d80 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
29d90 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
29da0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
29db0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
29dc0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
29dd0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
29de0 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
29df0 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
29e00 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
29e10 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e  >pSelect;.    in
29e20 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20  t isAggSub;..   
29e30 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
29e40 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
29e50 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
29e60 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
29e70 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
29e80 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
29e90 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
29ea0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
29eb0 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
29ec0 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
29ed0 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
29ee0 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
29ef0 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
29f00 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
29f10 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
29f20 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
29f30 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
29f40 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
29f50 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
29f60 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
29f70 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
29f80 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
29f90 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
29fa0 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
29fb0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
29fc0 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
29fd0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
29fe0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
29ff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
2a000 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65  em->viaCoroutine
2a010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2a020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a030 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
2a040 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2a050 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a060 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
2a070 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2a080 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
2a090 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
2a0a0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
2a0b0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
2a0c0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
2a0d0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
2a0e0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
2a0f0 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
2a100 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
2a110 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
2a120 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
2a130 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
2a140 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
2a150 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
2a160 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
2a170 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
2a180 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
2a190 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
2a1a0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
2a1b0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
2a1c0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
2a1d0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
2a1e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
2a1f0 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
2a200 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2a210 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
2a220 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
2a230 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2a240 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
2a250 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
2a260 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
2a270 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
2a280 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
2a290 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
2a2a0 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
2a2b0 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
2a2c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2a2d0 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
2a2e0 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
2a2f0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2a300 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
2a310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a320 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  i = -1;.    }els
2a330 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e  e if( pTabList->
2a340 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20  nSrc==1.        
2a350 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2a360 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2a370 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2a380 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ne).    ){.     
2a390 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2a3a0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2a3b0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2a3c0 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2a3d0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2a3e0 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2a3f0 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2a400 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2a410 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2a420 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2a430 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2a440 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2a450 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a470 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
2a480 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72  outine, pItem->r
2a490 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64  egReturn, 0, add
2a4a0 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rTop);.      Vdb
2a4b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2a4c0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2a4d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70  zName));.      p
2a4e0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2a4f0 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  b = addrTop;.   
2a500 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2a510 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
2a520 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
2a530 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2a540 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2a550 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2a560 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2a570 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2a580 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2a590 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2a5a0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2a5b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2a5c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2a5d0 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
2a5e0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2a5f0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2a600 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2a610 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2a620 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2a630 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2a640 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2a650 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
2a660 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2a670 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
2a680 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2a690 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
2a6a0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2a6b0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2a6c0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
2a6d0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
2a6e0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2a6f0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
2a700 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
2a710 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
2a720 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2a730 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
2a740 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a750 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
2a760 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
2a770 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
2a780 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
2a790 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
2a7a0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
2a7b0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
2a7c0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
2a7d0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
2a7e0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
2a7f0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
2a800 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
2a810 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
2a820 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
2a830 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
2a840 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2a850 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
2a860 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2a870 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2a880 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
2a890 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2a8a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2a8b0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
2a8c0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2a8d0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2a8e0 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
2a8f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2a900 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
2a910 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2a920 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
2a930 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
2a940 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
2a950 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
2a960 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
2a970 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
2a980 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
2a990 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2a9a0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
2a9b0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
2a9c0 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
2a9d0 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
2a9e0 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
2a9f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2aa00 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2aa10 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2aa20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2aa30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2aa40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2aa50 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
2aa60 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
2aa70 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
2aa80 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2aa90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2aaa0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2aab0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
2aac0 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74  RT_EphemTab, pIt
2aad0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
2aae0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2aaf0 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2ab00 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2ab10 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2ab20 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2ab30 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2ab40 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2ab50 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2ab60 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2ab70 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2ab80 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2ab90 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2aba0 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2abb0 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2abc0 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2abd0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2abe0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2abf0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2ac00 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2ac10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ac20 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2ac30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2ac40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ac50 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2ac60 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2ac70 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2ac80 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2ac90 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2aca0 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
2acb0 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
2acc0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2acd0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2ace0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
2acf0 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
2ad00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2ad10 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
2ad20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2ad30 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
2ad40 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
2ad50 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
2ad60 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2ad70 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
2ad80 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
2ad90 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
2ada0 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
2adb0 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
2adc0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
2add0 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
2ade0 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44  p->pHaving;.  sD
2adf0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d  istinct.isTnct =
2ae00 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2ae10 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b  SF_Distinct)!=0;
2ae20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ae30 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
2ae40 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68  ELECT.  /* If th
2ae50 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71  ere is are a seq
2ae60 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73  uence of queries
2ae70 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72  , do the earlier
2ae80 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a   ones first..  *
2ae90 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2aea0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2aeb0 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2aec0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2aed0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2aee0 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2aef0 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2af00 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2af10 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2af20 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2af30 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2af40 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2af50 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2af60 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2af70 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2af80 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2af90 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2afa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75  ..  /* If the qu
2afb0 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20  ery is DISTINCT 
2afc0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
2afd0 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61   but is not an a
2afe0 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20  ggregate, and . 
2aff0 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63   ** if the selec
2b000 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61  t-list is the sa
2b010 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20  me as the ORDER 
2b020 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68  BY list, then th
2b030 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61  is query.  ** ca
2b040 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2b050 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e  s a GROUP BY. In
2b060 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
2b070 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
2b080 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
2b090 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f  T xyz FROM ... O
2b0a0 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a  RDER BY xyz.  **
2b0b0 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f  .  ** is transfo
2b0c0 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  rmed to:.  **.  
2b0d0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79  **     SELECT xy
2b0e0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50  z FROM ... GROUP
2b0f0 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59   BY xyz ORDER BY
2b100 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   xyz.  **.  ** T
2b110 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
2b120 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61  s preferred as a
2b130 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f   single index (o
2b140 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61  r temp-table) ma
2b150 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20  y be .  ** used 
2b160 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44  for both the ORD
2b170 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ER BY and DISTIN
2b180 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41  CT processing. A
2b190 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20  s originally .  
2b1a0 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71  ** written the q
2b1b0 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20  uery must use a 
2b1c0 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61  temp-table for a
2b1d0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
2b1e0 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42  he ORDER .  ** B
2b1f0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20  Y and DISTINCT, 
2b200 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20  and an index or 
2b210 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61  separate temp-ta
2b220 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65  ble for the othe
2b230 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
2b240 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
2b250 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
2b260 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
2b270 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c  tinct .   && sql
2b280 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
2b290 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72  are(sSort.pOrder
2b2a0 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d  By, p->pEList, -
2b2b0 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  1)==0.  ){.    p
2b2c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2b2d0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20  F_Distinct;.    
2b2e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
2b2f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2b300 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
2b310 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  0);.    pGroupBy
2b320 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
2b330 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
2b340 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
2b350 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
2b360 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
2b370 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
2b380 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
2b390 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
2b3a0 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
2b3b0 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
2b3c0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
2b3d0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
2b3e0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
2b3f0 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
2b400 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
2b410 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
2b420 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2b430 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2b440 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
2b450 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2b460 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
2b470 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
2b480 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
2b490 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
2b4a0 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
2b4b0 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
2b4c0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
2b4d0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
2b4e0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
2b4f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2b500 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
2b510 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
2b520 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
2b530 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
2b540 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
2b550 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
2b560 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
2b570 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
2b580 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
2b590 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
2b5a0 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
2b5b0 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
2b5c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
2b5d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
2b5e0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
2b5f0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2b600 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72  ist(pParse, sSor
2b610 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
2b620 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2b630 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2b640 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2b650 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
2b660 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
2b670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b680 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2b690 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2b6a0 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
2b6b0 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
2b6c0 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
2b6d0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
2b6e0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2b6f0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2b700 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
2b710 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
2b720 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2b730 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
2b740 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2b750 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
2b760 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2b770 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
2b780 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
2b790 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
2b7a0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
2b7b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b7c0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2b7d0 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
2b7e0 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
2b7f0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
2b800 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
2b810 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
2b820 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2b830 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
2b840 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
2b850 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
2b860 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
2b870 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
2b880 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
2b890 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61 64  t==0 && sSort.ad
2b8a0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29  drSortIndex>=0 )
2b8b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2b8c0 65 47 65 74 4f 70 28 76 2c 20 73 53 6f 72 74 2e  eGetOp(v, sSort.
2b8d0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
2b8e0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
2b8f0 65 72 4f 70 65 6e 3b 0a 20 20 20 20 73 53 6f 72  erOpen;.    sSor
2b900 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
2b910 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
2b920 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
2b930 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
2b940 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
2b950 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
2b960 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
2b970 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2b980 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74  nct ){.    sDist
2b990 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70  inct.tabTnct = p
2b9a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
2b9b0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64     sDistinct.add
2b9c0 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56  rTnct = sqlite3V
2b9d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2b9e0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ba10 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
2ba20 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
2ba50 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2ba60 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
2ba70 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2baa0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2bab0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2bac0 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2bad0 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2bae0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2baf0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2bb00 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2bb10 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2bb20 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2bb30 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2bb40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2bb50 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2bb60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2bb70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2bb80 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2bb90 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2bba0 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2bbb0 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2bbc0 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2bbd0 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2bbe0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2bbf0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2bc00 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2bc10 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2bc20 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2bc30 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2bc40 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2bc70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2bc80 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
2bc90 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2bca0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2bcb0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2bcc0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
2bcd0 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
2bce0 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
2bcf0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
2bd00 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2bd10 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2bd20 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2bd30 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2bd40 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
2bd50 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2bd60 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
2bd70 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
2bd80 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
2bd90 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
2bda0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
2bdb0 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2bdc0 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e   ){.      sSort.
2bdd0 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33  nOBSat = sqlite3
2bde0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2bdf0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  WInfo);.      if
2be00 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d  ( sSort.nOBSat==
2be10 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e  sSort.pOrderBy->
2be20 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
2be30 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
2be40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2be50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f   }..    /* If so
2be60 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
2be70 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
2be80 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
2be90 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
2bea0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
2beb0 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
2bec0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
2bed0 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
2bee0 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
2bef0 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2bf00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2bf10 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2bf20 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e  dex>=0 && sSort.
2bf30 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
2bf40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bf50 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
2bf60 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2bf70 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  dex);.    }..   
2bf80 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
2bf90 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
2bfa0 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
2bfb0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2bfc0 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p, pEList, -1, &
2bfd0 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
2bfe0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c000 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
2c010 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
2c020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c030 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2c040 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
2c050 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
2c060 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2c070 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
2c080 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
2c090 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2c0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2c0b0 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
2c0c0 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
2c0d0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
2c0e0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
2c0f0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
2c100 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
2c110 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
2c120 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
2c130 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
2c140 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
2c150 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
2c160 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
2c170 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
2c180 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
2c190 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
2c1a0 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
2c1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2c1c0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
2c1d0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
2c1e0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
2c1f0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
2c200 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
2c210 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
2c220 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
2c230 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
2c240 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
2c250 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
2c260 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
2c270 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
2c2a0 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
2c2b0 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
2c2c0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
2c2d0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
2c2e0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
2c2f0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
2c300 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
2c310 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
2c320 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
2c330 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
2c340 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
2c350 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
2c360 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
2c370 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
2c380 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
2c390 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
2c3a0 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
2c3b0 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
2c3c0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
2c3d0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
2c3e0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
2c3f0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
2c400 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72  */.    int order
2c410 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72  ByGrp = 0; /* Tr
2c420 75 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20  ue if the GROUP 
2c430 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  BY and ORDER BY 
2c440 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a  are the same */.
2c450 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
2c460 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
2c470 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
2c480 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
2c490 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
2c4a0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
2c4b0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
2c4c0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
2c4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c4f0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2c500 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2c510 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
2c520 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2c530 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
2c540 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
2c550 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
2c560 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
2c570 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
2c580 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
2c590 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
2c5a0 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
2c5b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c5c0 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
2c5d0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
2c5e0 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
2c5f0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
2c600 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
2c610 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
2c620 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2c630 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
2c640 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
2c650 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
2c660 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
2c670 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
2c680 7d 0a 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  }...    /* If th
2c690 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
2c6a0 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
2c6b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
2c6c0 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a  d they are.    *
2c6d0 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65  * identical, the
2c6e0 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73  n it may be poss
2c6f0 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20  ible to disable 
2c700 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2c710 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  use .    ** on t
2c720 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20  he grounds that 
2c730 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c  the GROUP BY wil
2c740 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73  l cause elements
2c750 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20   to come out .  
2c760 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72    ** in the corr
2c770 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c  ect order. It al
2c780 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65  so may not - the
2c790 20 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73   GROUP BY may us
2c7a0 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
2c7b0 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
2c7c0 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
2c7d0 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
2c7e0 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
2c7f0 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
2c800 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
2c810 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
2c820 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
2c830 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
2c840 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
2c850 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
2c860 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
2c870 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
2c880 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
2c890 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
2c8a0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
2c8b0 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
2c8c0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
2c8d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
2c8e0 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
2c8f0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
2c900 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
2c910 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
2c920 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
2c930 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
2c940 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
2c950 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2c960 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
2c970 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
2c980 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
2c990 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
2c9a0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
2c9b0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
2c9c0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
2c9d0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
2c9e0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
2c9f0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
2ca00 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
2ca10 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
2ca20 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
2ca30 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
2ca40 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
2ca50 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
2ca60 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
2ca70 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
2ca80 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
2ca90 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2caa0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
2cab0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2cac0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
2cad0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
2cae0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
2caf0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
2cb00 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
2cb10 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
2cb20 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
2cb30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2cb40 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2cb50 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
2cb60 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
2cb70 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
2cb80 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2cb90 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73  yzeAggregates(&s
2cba0 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20  NC, pHaving);.  
2cbb0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2cbc0 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20  .nAccumulator = 
2cbd0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2cbe0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2cbf0 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b  <sAggInfo.nFunc;
2cc00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
2cc10 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2cc20 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61  perty(sAggInfo.a
2cc30 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45  Func[i].pExpr, E
2cc40 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2cc50 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2cc60 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e  s |= NC_InAggFun
2cc70 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
2cc80 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
2cc90 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
2cca0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
2ccb0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
2ccc0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
2ccd0 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a   ~NC_InAggFunc;.
2cce0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
2ccf0 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73  fo.mxReg = pPars
2cd00 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
2cd10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2cd20 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2cd30 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
2cd40 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
2cd50 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
2cd60 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
2cd70 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
2cd80 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
2cd90 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
2cda0 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
2cdb0 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
2cdc0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
2cdd0 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
2cde0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
2cdf0 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
2ce00 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
2ce10 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
2ce20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
2ce30 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
2ce40 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
2ce50 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
2ce60 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
2ce70 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
2ce80 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
2ce90 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
2cea0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2ceb0 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
2cec0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2ced0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
2cee0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
2cef0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2cf00 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
2cf10 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
2cf20 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
2cf30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2cf40 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
2cf50 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
2cf60 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
2cf70 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
2cf80 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
2cf90 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
2cfa0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
2cfb0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
2cfc0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
2cfd0 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
2cfe0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
2cff0 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
2d000 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
2d010 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
2d020 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
2d030 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
2d040 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
2d050 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
2d060 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
2d070 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
2d080 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
2d090 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
2d0a0 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
2d0b0 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
2d0c0 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
2d0d0 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
2d0e0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
2d0f0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
2d100 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74  all, the OP_Sort
2d110 65 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69  erOpen instructi
2d120 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
2d130 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
2d140 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
2d150 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
2d160 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
2d170 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2d180 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
2d190 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2d1a0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d1b0 47 72 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67  GroupBy, 0, sAgg
2d1c0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Info.nColumn);. 
2d1d0 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67       addrSorting
2d1e0 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Idx = sqlite3Vdb
2d1f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
2d200 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20  rterOpen, .     
2d210 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
2d220 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e  rtingIdx, sAggIn
2d230 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
2d240 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c  n, .          0,
2d250 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2d260 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
2d270 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2d280 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  ize memory locat
2d290 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f  ions used by GRO
2d2a0 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65 20  UP BY aggregate 
2d2b0 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20  processing.     
2d2c0 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c   */.      iUseFl
2d2d0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2d2e0 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72  Mem;.      iAbor
2d2f0 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  tFlag = ++pParse
2d300 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
2d310 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70  gOutputRow = ++p
2d320 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2d330 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
2d340 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2d350 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2d360 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
2d370 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2d380 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73     addrReset = s
2d390 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2d3a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41  bel(v);.      iA
2d3b0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2d3c0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2d3d0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2d3e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2d3f0 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61       iBMem = pPa
2d400 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2d410 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2d420 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2d430 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
2d440 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d450 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2d460 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
2d470 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2d480 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20  v, "clear abort 
2d490 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
2d4a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2d4b0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2d4c0 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20  0, iUseFlag);.  
2d4d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d4e0 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63  (v, "indicate ac
2d4f0 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22  cumulator empty"
2d500 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2d510 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2d520 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d  P_Null, 0, iAMem
2d530 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79  , iAMem+pGroupBy
2d540 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20  ->nExpr-1);..   
2d550 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f     /* Begin a lo
2d560 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74  op that will ext
2d570 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20  ract all source 
2d580 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59  rows in GROUP BY
2d590 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a   order..      **
2d5a0 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f   This might invo
2d5b0 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74 65  lve two separate
2d5c0 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f   loops with an O
2d5d0 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65  P_Sort in betwee
2d5e0 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  n, or.      ** i
2d5f0 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e  t might be a sin
2d600 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73  gle loop that us
2d610 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65  es an index to e
2d620 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69  xtract informati
2d630 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  on.      ** in t
2d640 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20 74  he right order t
2d650 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20  o begin with..  
2d660 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2d670 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d680 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
2d690 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
2d6a0 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d  ;.      pWInfo =
2d6b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d6c0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2d6d0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72  ist, pWhere, pGr
2d6e0 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20  oupBy, 0,.      
2d6f0 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2d700 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20  Y | (orderByGrp 
2d710 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  ? WHERE_SORTBYGR
2d720 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20  OUP : 0), 0.    
2d730 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70    );.      if( p
2d740 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
2d750 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2d760 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2d770 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2d780 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  fo)==pGroupBy->n
2d790 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2d7a0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2d7b0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2d7c0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2d7d0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2d7e0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2d7f0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2d800 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2d810 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2d820 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2d830 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2d840 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2d850 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2d860 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2d870 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2d880 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2d890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d8a0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2d8b0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2d8c0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2d8d0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2d8e0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2d8f0 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2d900 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2d910 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2d920 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2d930 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2d940 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2d950 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2d960 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2d970 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2d980 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2d990 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2d9a0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2d9b0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2d9c0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2d9d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2d9e0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2d9f0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2da00 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2da10 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2da20 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2da30 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2da40 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2da60 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2da70 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2da80 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2da90 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2daa0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2dab0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2dac0 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a  Col = nGroupBy;.
2dad0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2dae0 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f  upBy;.        fo
2daf0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
2db00 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
2db10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2db20 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e  AggInfo.aCol[i].
2db30 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2db40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2db50 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nCol++;.        
2db60 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2db70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2db80 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
2db90 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
2dba0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f  ange(pParse, nCo
2dbb0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2dbc0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2dbd0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
2dbe0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2dbf0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2dc00 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67  e, pGroupBy, reg
2dc10 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Base, 0);.      
2dc20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2dc30 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2dc40 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2dc50 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2dc60 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
2dc70 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
2dc80 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
2dc90 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
2dca0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
2dcb0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2dcc0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
2dcd0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
2dce0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
2dcf0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
2dd00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2dd10 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
2dd20 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
2dd50 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
2dd60 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
2dd70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2dd80 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2dda0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2ddb0 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
2ddc0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
2ddd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
2dde0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
2ddf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de00 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
2de10 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2de20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2de30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2de40 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
2de50 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
2de60 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
2de70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2de80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2de90 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
2dea0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2deb0 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
2dec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
2ded0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
2dee0 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
2def0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2df00 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
2df10 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
2df20 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2df30 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2df40 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2df50 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2df60 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
2df70 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
2df80 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
2df90 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
2dfa0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2dfb0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2dfc0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2dfd0 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
2dfe0 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
2dff0 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
2e000 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e010 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2e020 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
2e030 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
2e040 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
2e050 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
2e060 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20  OUP BY sort")); 
2e070 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2e080 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2e090 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
2e0a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
2e0b0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2e0c0 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  ar(pParse);..   
2e0d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2e0e0 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74  f the index or t
2e0f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75  emporary table u
2e100 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50  sed by the GROUP
2e110 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a   BY sort.      *
2e120 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79  * will naturally
2e130 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
2e140 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69   the order requi
2e150 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52  red by the ORDER
2e160 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61   BY.      ** cla
2e170 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20  use, cancel the 
2e180 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
2e190 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69  open coded earli
2e1a0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  er..      **.   
2e1b0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e     ** This is an
2e1c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2e1d0 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
2e1e0 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74  er should result
2e1f0 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
2e200 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51     ** Use the SQ
2e210 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2e220 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
2e230 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2e240 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20 20  MIZER to .      
2e250 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  ** disable this 
2e260 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
2e270 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
2e280 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  s.  */.      if(
2e290 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20 4f   orderByGrp && O
2e2a0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2e2b0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
2e2c0 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20 20  oupByOrder) .   
2e2d0 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79 53      && (groupByS
2e2e0 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57 68  ort || sqlite3Wh
2e2f0 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49 6e  ereIsSorted(pWIn
2e300 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  fo)).      ){.  
2e310 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
2e320 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2e330 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2e340 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f  ngeToNoop(v, sSo
2e350 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2e360 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2e370 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
2e380 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2e390 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
2e3a0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
2e3b0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
2e3c0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
2e3d0 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
2e3e0 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
2e3f0 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
2e400 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
2e410 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2e420 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
2e430 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
2e440 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
2e450 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
2e460 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
2e470 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
2e480 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
2e490 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
2e4a0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
2e4b0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2e4c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e4d0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2e4e0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
2e4f0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2e500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e510 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
2e520 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
2e530 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2e540 73 6f 72 74 4f 75 74 2c 73 6f 72 74 50 54 61 62  sortOut,sortPTab
2e550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e560 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
2e570 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
2e580 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
2e590 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2e5a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2e5b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2e5c0 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
2e5d0 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
2e5e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e5f0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2e600 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
2e610 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e620 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2e630 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
2e640 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
2e650 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e660 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2e670 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2e680 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
2e690 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
2e6a0 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6c0 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
2e6d0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
2e6e0 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
2e6f0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
2e700 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2e710 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2e720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e730 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
2e740 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 20  j1+1, 0, j1+1); 
2e750 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2e760 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2e770 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75  ate code that ru
2e780 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ns whenever the 
2e790 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73  GROUP BY changes
2e7a0 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67  ..      ** Chang
2e7b0 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  es in the GROUP 
2e7c0 42 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20  BY are detected 
2e7d0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2e7e0 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c  code.      ** bl
2e7f0 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77  ock.  If there w
2e800 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20  ere no changes, 
2e810 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b  this block is sk
2e820 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ipped..      **.
2e830 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f        ** This co
2e840 64 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e  de copies curren
2e850 74 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73  t group by terms
2e860 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e   in b0,b1,b2,...
2e870 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74  .      ** over t
2e880 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20  o a0,a1,a2.  It 
2e890 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f  then calls the o
2e8a0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
2e8b0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
2e8c0 73 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61  sets the aggrega
2e8d0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  te accumulator r
2e8e0 65 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70  egisters in prep
2e8f0 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  aration.      **
2e900 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52   for the next GR
2e910 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20  OUP BY batch..  
2e920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2e930 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
2e940 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20  (pParse, iBMem, 
2e950 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iAMem, pGroupBy-
2e960 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73  >nExpr);.      s
2e970 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e980 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2e990 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2e9a0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2e9b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2e9c0 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  , "output one ro
2e9d0 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  w"));.      sqli
2e9e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e9f0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72   OP_IfPos, iAbor
2ea00 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b  tFlag, addrEnd);
2ea10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2ea20 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2ea30 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61  ent((v, "check a
2ea40 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2ea50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ea60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2ea70 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2ea80 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56  rReset);.      V
2ea90 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2eaa0 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f  reset accumulato
2eab0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
2eac0 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65  Update the aggre
2ead0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
2eae0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  s based on the c
2eaf0 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20  ontent of.      
2eb00 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ** the current r
2eb10 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ow.      */.    
2eb20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2eb30 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
2eb40 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
2eb50 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2eb60 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2eb70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2eb80 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2eb90 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
2eba0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ebb0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
2ebc0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
2ebd0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2ebe0 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
2ebf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ec00 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
2ec10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ec20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ec30 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
2ec40 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2ec50 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
2ec60 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
2ec70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2ec80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec90 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
2eca0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
2ecb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2ecc0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
2ecd0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
2ece0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2ecf0 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
2ed00 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
2ed10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2ed20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2ed30 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
2ed40 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
2ed50 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2ed60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2ed70 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
2ed80 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
2ed90 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
2eda0 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
2edb0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2edc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2edd0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
2ede0 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
2edf0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2ee00 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2ee10 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
2ee20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
2ee30 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
2ee40 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
2ee50 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
2ee60 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
2ee70 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
2ee80 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
2ee90 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
2eea0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
2eeb0 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
2eec0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
2eed0 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
2eee0 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
2eef0 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
2ef00 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
2ef10 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
2ef20 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
2ef30 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
2ef40 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
2ef50 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
2ef60 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
2ef70 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
2ef80 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
2ef90 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
2efa0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2efb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2efc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2efd0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
2efe0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2eff0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f000 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
2f010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2f020 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2f030 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2f040 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
2f050 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2f060 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
2f070 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
2f080 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2f090 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2f0a0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2f0b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f0c0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
2f0d0 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
2f0e0 70 75 74 52 6f 77 2b 32 29 3b 20 56 64 62 65 43  putRow+2); VdbeC
2f0f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2f100 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f110 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
2f120 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
2f130 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
2f140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f150 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2f160 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
2f170 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
2f180 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
2f190 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2f1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2f1b0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2f1c0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
2f1d0 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
2f1e0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2f1f0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
2f200 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
2f210 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p->pEList, -1, &
2f220 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  sSort,.         
2f230 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
2f240 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f260 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2f270 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
2f280 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
2f290 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f2a0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2f2b0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2f2c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2f2d0 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
2f2e0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
2f2f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2f300 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2f310 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
2f320 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
2f330 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
2f340 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2f350 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2f360 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
2f370 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
2f380 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2f390 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2f3a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f3b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f3c0 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
2f3d0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
2f3e0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
2f3f0 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
2f400 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
2f410 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
2f420 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
2f430 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
2f440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2f450 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
2f460 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2f470 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
2f480 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
2f490 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
2f4a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
2f4b0 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
2f4c0 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
2f4d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
2f4e0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
2f4f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2f500 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
2f510 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
2f520 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f530 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
2f540 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
2f550 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
2f560 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
2f570 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2f580 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
2f590 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
2f5a0 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
2f5b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
2f5c0 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
2f5d0 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
2f5e0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
2f5f0 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
2f600 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
2f610 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
2f620 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
2f630 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
2f640 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2f650 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
2f660 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
2f670 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
2f680 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
2f690 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
2f6a0 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
2f6b0 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
2f6c0 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
2f6d0 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
2f6e0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
2f6f0 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
2f700 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
2f710 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2f720 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
2f730 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2f740 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2f750 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2f760 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
2f770 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
2f780 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
2f790 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2f7a0 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
2f7b0 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
2f7c0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2f7d0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f7f0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2f800 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
2f810 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2f820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f830 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
2f840 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
2f850 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
2f860 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
2f890 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
2f8a0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
2f8b0 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f8d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
2f8e0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
2f8f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
2f900 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2f910 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
2f920 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
2f930 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
2f940 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
2f950 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2f960 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
2f970 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
2f980 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
2f990 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
2f9a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2f9b0 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
2f9c0 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
2f9d0 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
2f9e0 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
2f9f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fa00 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
2fa10 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
2fa20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
2fa30 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
2fa40 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fa50 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
2fa60 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
2fa70 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
2fa80 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
2fa90 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
2faa0 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
2fab0 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
2fac0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
2fad0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2fae0 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
2faf0 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
2fb00 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
2fb10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
2fb20 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
2fb30 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
2fb40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2fb50 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
2fb60 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2fb70 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
2fb80 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
2fb90 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
2fba0 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
2fbb0 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
2fbc0 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
2fbd0 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
2fbe0 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
2fbf0 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
2fc00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2fc10 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
2fc20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fc30 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2fc40 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
2fc50 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
2fc60 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
2fc70 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
2fc80 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
2fc90 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
2fca0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2fcb0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
2fcc0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
2fcd0 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
2fce0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
2fcf0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
2fd00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2fd10 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
2fd20 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
2fd30 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
2fd40 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
2fd50 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
2fd60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2fd70 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
2fd80 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
2fd90 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2fda0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2fdb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fdc0 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
2fdd0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
2fde0 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
2fdf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fe00 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
2fe10 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
2fe20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2fe30 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
2fe40 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
2fe50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
2fe60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
2fe70 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
2fe80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2fe90 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
2fea0 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
2feb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
2fec0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2fed0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2fee0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
2fef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2ff00 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
2ff10 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
2ff20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
2ff30 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
2ff40 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
2ff50 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
2ff60 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
2ff70 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
2ff80 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
2ff90 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
2ffa0 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
2ffb0 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
2ffc0 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
2ffd0 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
2ffe0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
2fff0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
30000 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
30010 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
30020 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
30030 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
30040 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
30050 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
30060 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
30070 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
30080 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
30090 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
300a0 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
300b0 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
300c0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
300d0 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
300e0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
300f0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
30100 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
30110 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
30120 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
30130 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
30140 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30150 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
30160 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
30170 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
30180 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
30190 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
301a0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
301b0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
301c0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
301d0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
301e0 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
301f0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
30200 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
30210 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
30220 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
30230 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
30240 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
30250 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
30260 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
30270 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
30280 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
30290 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
302a0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
302b0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
302c0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
302d0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
302e0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
302f0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
30300 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
30310 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
30320 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
30330 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
30340 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
30350 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
30360 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
30370 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30380 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
30390 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
303a0 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
303b0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
303c0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
303d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
303e0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
303f0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
30400 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
30410 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
30420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
30430 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
30440 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
30450 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
30460 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30470 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
30480 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
30490 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
304a0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
304b0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
304c0 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
304d0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
304e0 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
304f0 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
30500 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
30510 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
30520 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
30530 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
30540 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
30550 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
30560 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
30570 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
30580 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
30590 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
305a0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
305b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
305c0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
305d0 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
305e0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
305f0 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
30600 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
30610 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
30620 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
30630 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
30640 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
30650 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
30660 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
30670 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
30680 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
30690 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
306a0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
306b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
306c0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
306d0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
306e0 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b  inMax,0,flag,0);
306f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
30700 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
30710 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
30720 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
30730 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
30740 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
30750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30760 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
30770 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
30780 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
30790 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
307a0 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
307b0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
307c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
307d0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
307e0 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  nfo)>0 ){.      
307f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30800 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
30810 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72  , 0, sqlite3Wher
30820 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
30830 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fo));.          
30840 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
30850 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
30860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30870 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
30880 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
30890 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
308a0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
308b0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
308c0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
308d0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
308e0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
308f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
30900 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
30910 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
30920 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
30930 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
30940 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
30950 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
30960 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
30970 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
30980 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
30990 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
309a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
309b0 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
309c0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
309d0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
309e0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
309f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
30a00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30a10 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
30a20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
30a30 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
30a40 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
30a50 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
30a60 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
30a70 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
30a80 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
30a90 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
30aa0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
30ab0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
30ac0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
30ad0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
30ae0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
30af0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
30b00 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
30b10 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
30b20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
30b30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
30b40 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
30b50 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 6e 4f  pParse, sSort.nO
30b60 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54 20  BSat>0 ? "RIGHT 
30b70 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42 59  PART OF ORDER BY
30b80 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20  ":"ORDER BY");. 
30b90 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
30ba0 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ail(pParse, p, &
30bb0 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  sSort, pEList->n
30bc0 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20  Expr, pDest);.  
30bd0 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  }..  /* Jump her
30be0 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71  e to skip this q
30bf0 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
30c00 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
30c10 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20  bel(v, iEnd);.. 
30c20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 68   /* The SELECT h
30c30 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 49  as been coded. I
30c40 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72  f there is an er
30c50 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
30c60 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a   structure,.  **
30c70 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
30c80 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65 72  code to 1. Other
30c90 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20  wise 0. */.  rc 
30ca0 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  = (pParse->nErr>
30cb0 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f  0);..  /* Contro
30cc0 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
30cd0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
30ce0 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
30cf0 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
30d00 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
30d10 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
30d20 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
30d30 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
30d40 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
30d50 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
30d60 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
30d70 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
30d80 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
30d90 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
30da0 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
30db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
30dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
30dd0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
30de0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
30df0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
30e00 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
30e10 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
30e20 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
30e30 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
30e40 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
30e50 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
30e60 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53  fo.aFunc);.#if S
30e70 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30e80 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
30e90 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
30ea0 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  d processing\n")
30eb0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65  );.  pParse->nSe
30ec0 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65  lectIndent--;.#e
30ed0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
30ee0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
30ef0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 47  TE_DEBUG./*.** G
30f00 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
30f10 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
30f20 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65  tion of a the Se
30f30 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
30f40 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65 65  void sqlite3Tree
30f50 56 69 65 77 53 65 6c 65 63 74 28 54 72 65 65 56  ViewSelect(TreeV
30f60 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73  iew *pView, cons
30f70 74 20 53 65 6c 65 63 74 20 2a 70 2c 20 75 38 20  t Select *p, u8 
30f80 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a 20  moreToFollow){. 
30f90 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 70 56   int n = 0;.  pV
30fa0 69 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65  iew = sqlite3Tre
30fb0 65 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c  eViewPush(pView,
30fc0 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a   moreToFollow);.
30fd0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
30fe0 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53 45  wLine(pView, "SE
30ff0 4c 45 43 54 25 73 25 73 20 28 30 78 25 70 29 22  LECT%s%s (0x%p)"
31000 2c 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c  ,.    ((p->selFl
31010 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
31020 74 29 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22  t) ? " DISTINCT"
31030 20 3a 20 22 22 29 2c 0a 20 20 20 20 28 28 70 2d   : ""),.    ((p-
31040 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
31050 67 67 72 65 67 61 74 65 29 20 3f 20 22 20 61 67  ggregate) ? " ag
31060 67 5f 66 6c 61 67 22 20 3a 20 22 22 29 2c 20 70  g_flag" : ""), p
31070 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  .  );.  if( p->p
31080 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
31090 6e 53 72 63 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  nSrc ) n++;.  if
310a0 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 6e 2b  ( p->pWhere ) n+
310b0 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f  +;.  if( p->pGro
310c0 75 70 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  upBy ) n++;.  if
310d0 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 20 6e  ( p->pHaving ) n
310e0 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ++;.  if( p->pOr
310f0 64 65 72 42 79 20 29 20 6e 2b 2b 3b 0a 20 20 69  derBy ) n++;.  i
31100 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 6e  f( p->pLimit ) n
31110 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66  ++;.  if( p->pOf
31120 66 73 65 74 20 29 20 6e 2b 2b 3b 0a 20 20 69 66  fset ) n++;.  if
31130 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 6e 2b  ( p->pPrior ) n+
31140 2b 3b 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65  +;.  sqlite3Tree
31150 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69  ViewExprList(pVi
31160 65 77 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 28  ew, p->pEList, (
31170 6e 2d 2d 29 3e 30 2c 20 22 72 65 73 75 6c 74 2d  n--)>0, "result-
31180 73 65 74 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e  set");.  if( p->
31190 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d  pSrc && p->pSrc-
311a0 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74  >nSrc ){.    int
311b0 20 69 3b 0a 20 20 20 20 70 56 69 65 77 20 3d 20   i;.    pView = 
311c0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
311d0 75 73 68 28 70 56 69 65 77 2c 20 28 6e 2d 2d 29  ush(pView, (n--)
311e0 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
311f0 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
31200 65 77 2c 20 22 46 52 4f 4d 22 29 3b 0a 20 20 20  ew, "FROM");.   
31210 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
31220 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
31230 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
31240 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
31250 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
31260 69 5d 3b 0a 20 20 20 20 20 20 53 74 72 41 63 63  i];.      StrAcc
31270 75 6d 20 78 3b 0a 20 20 20 20 20 20 63 68 61 72  um x;.      char
31280 20 7a 4c 69 6e 65 5b 31 30 30 5d 3b 0a 20 20 20   zLine[100];.   
31290 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
312a0 75 6d 49 6e 69 74 28 26 78 2c 20 7a 4c 69 6e 65  umInit(&x, zLine
312b0 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  , sizeof(zLine),
312c0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
312d0 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
312e0 20 22 7b 25 64 2c 2a 7d 22 2c 20 70 49 74 65 6d   "{%d,*}", pItem
312f0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
31300 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
31310 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  tabase ){.      
31320 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
31330 28 26 78 2c 20 30 2c 20 22 20 25 73 2e 25 73 22  (&x, 0, " %s.%s"
31340 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
31350 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  se, pItem->zName
31360 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
31370 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
31380 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31390 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
313a0 20 22 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a   " %s", pItem->z
313b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
313c0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
313d0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
313e0 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
313f0 78 2c 20 30 2c 20 22 20 74 61 62 6e 61 6d 65 3d  x, 0, " tabname=
31400 25 51 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %Q", pItem->pTab
31410 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
31420 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
31430 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
31440 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
31450 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 28 41 53  ntf(&x, 0, " (AS
31460 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41   %s)", pItem->zA
31470 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
31480 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
31490 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
314a0 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  FT ){.        sq
314b0 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
314c0 20 30 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22   0, " LEFT-JOIN"
314d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
314e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
314f0 46 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 20 20  Finish(&x);.    
31500 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31510 77 49 74 65 6d 28 70 56 69 65 77 2c 20 7a 4c 69  wItem(pView, zLi
31520 6e 65 2c 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  ne, i<p->pSrc->n
31530 53 72 63 2d 31 29 3b 20 0a 20 20 20 20 20 20 69  Src-1); .      i
31540 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
31550 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
31560 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31570 63 74 28 70 56 69 65 77 2c 20 70 49 74 65 6d 2d  ct(pView, pItem-
31580 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
31590 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
315a0 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
315b0 56 69 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  View);.    }.   
315c0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
315d0 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a  Pop(pView);.  }.
315e0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
315f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
31600 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
31610 2c 20 22 57 48 45 52 45 22 2c 20 28 6e 2d 2d 29  , "WHERE", (n--)
31620 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
31630 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
31640 65 77 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 30  ew, p->pWhere, 0
31650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
31660 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
31670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
31680 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
31690 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
316a0 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d  prList(pView, p-
316b0 3e 70 47 72 6f 75 70 42 79 2c 20 28 6e 2d 2d 29  >pGroupBy, (n--)
316c0 3e 30 2c 20 22 47 52 4f 55 50 42 59 22 29 3b 0a  >0, "GROUPBY");.
316d0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
316e0 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
316f0 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
31700 70 56 69 65 77 2c 20 22 48 41 56 49 4e 47 22 2c  pView, "HAVING",
31710 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73   (n--)>0);.    s
31720 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
31730 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 48 61  pr(pView, p->pHa
31740 76 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20 73 71  ving, 0);.    sq
31750 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
31760 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69  (pView);.  }.  i
31770 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
31780 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31790 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
317a0 69 65 77 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  iew, p->pOrderBy
317b0 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 4f 52 44 45  , (n--)>0, "ORDE
317c0 52 42 59 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  RBY");.  }.  if(
317d0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
317e0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
317f0 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4c 49  wItem(pView, "LI
31800 4d 49 54 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  MIT", (n--)>0);.
31810 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31820 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
31830 2d 3e 70 4c 69 6d 69 74 2c 20 30 29 3b 0a 20 20  ->pLimit, 0);.  
31840 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31850 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
31860 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65  .  if( p->pOffse
31870 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
31880 54 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69  TreeViewItem(pVi
31890 65 77 2c 20 22 4f 46 46 53 45 54 22 2c 20 28 6e  ew, "OFFSET", (n
318a0 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69  --)>0);.    sqli
318b0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
318c0 70 56 69 65 77 2c 20 70 2d 3e 70 4f 66 66 73 65  pView, p->pOffse
318d0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
318e0 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
318f0 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iew);.  }.  if( 
31900 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
31910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
31920 20 3d 20 22 55 4e 49 4f 4e 22 3b 0a 20 20 20 20   = "UNION";.    
31930 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
31940 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41  .      case TK_A
31950 4c 4c 3a 20 20 20 20 20 20 20 20 20 7a 4f 70 20  LL:         zOp 
31960 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
31970 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
31980 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
31990 20 20 7a 4f 70 20 3d 20 22 49 4e 54 45 52 53 45    zOp = "INTERSE
319a0 43 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CT";  break;.   
319b0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
319c0 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  T:      zOp = "E
319d0 58 43 45 50 54 22 3b 20 20 20 20 20 62 72 65 61  XCEPT";     brea
319e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  k;.    }.    sql
319f0 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
31a00 28 70 56 69 65 77 2c 20 7a 4f 70 2c 20 28 6e 2d  (pView, zOp, (n-
31a10 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  -)>0);.    sqlit
31a20 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
31a30 28 70 56 69 65 77 2c 20 70 2d 3e 70 50 72 69 6f  (pView, p->pPrio
31a40 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
31a50 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31a60 69 65 77 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  iew);.  }.  sqli
31a70 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
31a80 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  View);.}.#endif 
31a90 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
31aa0 2a 2f 0a                                         */.