/ Hex Artifact Content
Login

Artifact a4e8fda24c8eab2682a058bdda0d5d68cfe3919c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0ee0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ef0: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0f00: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0f10: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0f20: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0f30: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0f40: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0f50: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0f60: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
0f70: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
0f80: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
0f90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
0fa0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0fb0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0fc0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0fd0: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0fe0: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0ff0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
1000: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
1010: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1020: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1030: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1040: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
1050: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
1060: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
1070: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
1080: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
1090: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
10a0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
10b0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
10c0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
10d0: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
10e0: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
10f0: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
1100: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
1110: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1120: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
1130: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
1140: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
1150: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
1160: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
1170: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1180: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1190: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [1] = -1;.  if( 
11a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11b0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
11c0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 2c 20 70  lect(db, pNew, p
11d0: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29 3b 0a  New!=&standin);.
11e0: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
11f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1200: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
1210: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1220: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
1230: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
1240: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
1250: 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45 4c 45  New;.}..#if SELE
1260: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1270: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
1280: 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74 20 6f  me of a Select o
1290: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
12a0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
12b0: 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20 63 6f  me(Select *p, co
12c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
12d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a 4e 61  {.  if( p && zNa
12e0: 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  me ){.    sqlite
12f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1300: 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20  f(p->zSelName), 
1310: 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 73  p->zSelName, "%s
1320: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  ", zName);.  }.}
1330: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
1340: 44 65 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e  Delete the given
1350: 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
1360: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
1370: 20 73 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a   substructures..
1380: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1390: 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69  electDelete(sqli
13a0: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
13b0: 2a 70 29 7b 0a 20 20 63 6c 65 61 72 53 65 6c 65  *p){.  clearSele
13c0: 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a  ct(db, p, 1);.}.
13d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
13e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  pointer to the r
13f0: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
1400: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20   statement in a 
1410: 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  compound..*/.sta
1420: 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64  tic Select *find
1430: 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74  Rightmost(Select
1440: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
1450: 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d  ->pNext ) p = p-
1460: 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  >pNext;.  return
1470: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1480: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
1490: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
14a0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
14b0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
14c0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
14d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
14e0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
14f0: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
1500: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
1510: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
1520: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
1530: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
1540: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
1550: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
1560: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
1570: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
1580: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
1590: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
15a0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
15b0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
15c0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
15d0: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
15e0: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
15f0: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1600: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
1610: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
1620: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
1630: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
1640: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
1650: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
1660: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
1670: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1680: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
1690: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
16a0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
16b0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
16c0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
16d0: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
1700: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
1710: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
1720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1730: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
1740: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
1750: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
1760: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1770: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
1780: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
1790: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
17a0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
17b0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
17c0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
17d0: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
17e0: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
17f0: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1800: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1810: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1820: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1830: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1840: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1850: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1860: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
1870: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
1880: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
1890: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
18a0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
18b0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
18e0: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
18f0: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1900: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1910: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1920: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1930: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1940: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1950: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1960: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
1970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
1980: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
1990: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
19a0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
19b0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
19c0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
19d0: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
19e0: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
19f0: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1a00: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1a10: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1a20: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1a30: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1a40: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1a50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1a60: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
1a70: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1a80: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a90: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
1aa0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
1ab0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
1ac0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1ad0: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1ae0: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b10: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1b20: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1b30: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1b40: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1b50: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1b60: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1b70: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
1b80: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
1b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
1bb0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
1bc0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bd0: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1be0: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1bf0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1c00: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1c10: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c20: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1c30: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1c40: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1c50: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1c60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c70: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
1c80: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
1c90: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
1ca0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
1cb0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
1cc0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1cd0: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1ce0: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1cf0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1d00: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1d10: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1d20: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1d30: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1d40: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d50: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1d60: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
1d70: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
1d80: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
1d90: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
1da0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
1dc0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1dd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1de0: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1df0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1e00: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1e10: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1e20: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e40: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1e50: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1e60: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
1e70: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e80: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
1e90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1ea0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
1eb0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
1ec0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1ed0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1ee0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1ef0: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1f00: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1f10: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1f20: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1f30: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1f40: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1f50: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1f60: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
1f70: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
1f80: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
1f90: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
1fa0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
1fb0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
1fc0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1fd0: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1fe0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1ff0: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
2000: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
2010: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
2020: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2030: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
2040: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
2050: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
2060: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2070: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
2080: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
2090: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
20a0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
20b0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
20c0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
20d0: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
20e0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
20f0: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
2100: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
2110: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
2120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2130: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
2140: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
2150: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
2160: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
2180: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
2190: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
21a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
21b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
21c0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
21d0: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
21e0: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
21f0: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
2200: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
2210: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
2220: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
2230: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
2240: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
2250: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
2260: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
2270: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
2280: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
2290: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
22a0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
22b0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
22c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
22d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
22f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2300: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
2310: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
2320: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
2330: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
2340: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
2350: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2360: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
2370: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
2380: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
2390: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
23a0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
23c0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
23d0: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
23e0: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
23f0: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
2400: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
2410: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
2420: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
2430: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
2440: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
2450: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
2460: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
2470: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
2480: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
2490: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
24a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
24b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
24c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
24d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
2500: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
2510: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
2520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2530: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2540: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
2550: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
2560: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
2570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2580: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2590: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
25a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
25b0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25d0: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
25e0: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
25f0: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
2620: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
2630: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
2640: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2660: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
2670: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
2680: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
26b0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
26c0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
26d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
26e0: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
26f0: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
2700: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
2710: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
2720: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2730: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
2740: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
2750: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
2760: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
2770: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
2780: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
2790: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
27a0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
27b0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
27c0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
27d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
27e0: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
27f0: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2800: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2810: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2820: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2830: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2840: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2850: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2860: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
2870: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2880: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2890: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
28a0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
28b0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
28c0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
28d0: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
28e0: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
28f0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2900: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2910: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2920: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2930: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2940: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2950: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2960: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
2970: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
2980: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
2990: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
29a0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
29b0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
29c0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
29d0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
29e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
29f0: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2a00: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2a10: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2a20: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2a30: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2a40: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2a50: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2a60: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
2a70: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
2a80: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
2a90: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
2aa0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
2ab0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
2ac0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2ad0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2ae0: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2af0: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2b00: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2b10: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2b20: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2b30: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2b40: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2b50: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2b60: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2b70: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
2b80: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2b90: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
2ba0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
2bb0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
2bc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2bd0: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2be0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2bf0: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2c00: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2c10: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2c20: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2c30: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2c40: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2c50: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2c60: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
2c70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
2c80: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
2c90: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
2ca0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
2cb0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
2cc0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2cd0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2ce0: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2cf0: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2d00: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2d10: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2d20: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2d30: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2d40: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2d50: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2d60: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
2d70: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
2d80: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
2d90: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
2da0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
2db0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
2dc0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2dd0: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2de0: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2df0: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2e00: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2e10: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2e20: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2e30: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2e40: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2e50: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2e60: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
2e70: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2e80: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
2e90: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2ea0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2eb0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2ec0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2ed0: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2ee0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2ef0: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2f00: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2f10: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2f20: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f40: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2f50: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2f60: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
2f70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
2f80: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2f90: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
2fa0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
2fb0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2fc0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2fd0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2fe0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2ff0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
3000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
3010: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
3020: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
3030: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
3040: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
3050: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
3060: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
3070: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
3080: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
3090: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
30a0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
30b0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
30c0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
30d0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
30e0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
30f0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
3100: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
3110: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
3120: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
3130: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
3140: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
3150: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
3160: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
3170: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
3180: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
3190: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
31a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
31b0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
31c0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
31d0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
31e0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
31f0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
3200: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
3210: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
3240: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3250: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
3260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3270: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3280: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
3290: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32a0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
32b0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
32c0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
32d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32e0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
32f0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
3300: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
3310: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
3320: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
3330: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
3340: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
3350: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3360: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
3370: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
3380: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
3390: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
33a0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
33b0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
33c0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
33d0: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
33e0: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
33f0: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
3400: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
3410: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
3420: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
3430: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3440: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3450: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3460: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3470: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3480: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3490: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
34a0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
34b0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
34c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34d0: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
34e0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
34f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
3500: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
3510: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
3540: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
3550: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
3560: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
3570: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
3580: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
3590: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
35a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
35b0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
35c0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
35d0: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
35e0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
35f0: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
3600: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3610: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
3620: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
3630: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3640: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
3650: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
3660: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
3670: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
3680: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
3690: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
36a0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
36b0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
36c0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
36d0: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
36e0: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
36f0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3700: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3710: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
3720: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
3740: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
3750: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
3770: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
3780: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3790: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
37a0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
37b0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
37c0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
37d0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
37e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
37f0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3800: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3810: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3820: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3830: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3850: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3860: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
3870: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
3880: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
3890: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
38a0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
38b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
38c0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
38d0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
38e0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
38f0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3900: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3910: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3920: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3930: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3940: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3950: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3960: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
3970: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
3980: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
3990: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
39a0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
39b0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
39c0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
39d0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
39e0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
39f0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3a00: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3a10: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3a20: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3a30: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3a40: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3a50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3a60: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
3a70: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
3a80: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
3a90: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
3aa0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
3ab0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
3ac0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3ad0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3ae0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3af0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3b00: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3b10: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3b20: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3b30: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3b50: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3b70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
3b80: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
3b90: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
3ba0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
3bb0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3bc0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3bd0: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3be0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3c00: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3c10: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3c20: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3c30: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3c40: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3c50: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3c60: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
3c70: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
3c80: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
3c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
3ca0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3cb0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
3cc0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3cd0: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3cf0: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3d00: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3d10: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3d20: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3d30: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3d40: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3d60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3d70: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
3d80: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
3d90: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
3da0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
3db0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
3dc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3dd0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3df0: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3e00: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3e10: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3e20: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3e50: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3e60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3e70: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
3e80: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3e90: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
3ea0: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
3eb0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
3ec0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
3ed0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
3ee0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
3ef0: 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20  st,     /* Form 
3f00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
3f10: 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70  ct from this Exp
3f20: 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  rList */.  int i
3f30: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  Start,          
3f40: 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68  /* Begin with th
3f50: 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69  is column of pLi
3f60: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
3f70: 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ra           /* 
3f80: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78  Add this many ex
3f90: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  tra columns to t
3fa0: 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a  he end */.);../*
3fb0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
3fc0: 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  e that will push
3fd0: 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20 72   the record in r
3fe0: 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74 61  egisters regData
3ff0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67 44  .** through regD
4000: 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74 6f  ata+nData-1 onto
4010: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73 68  static void push
4030: 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50 61  OntoSorter(.  Pa
4040: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4050: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
4060: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72 74  ontext */.  Sort
4070: 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20  Ctx *pSort,     
4080: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
4090: 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44 45  n about the ORDE
40a0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
40b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
40c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77  ,       /* The w
40d0: 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  hole SELECT stat
40e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ement */.  int r
40f0: 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  egData,         
4100: 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73    /* First regis
4110: 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61  ter holding data
4120: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f   to be sorted */
4130: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4150: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4160: 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72 61  in the data arra
4170: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  y */.  int nPref
4180: 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a  ixReg         /*
4190: 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69 6f   No. of reg prio
41a0: 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76 61  r to regData ava
41b0: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 2a  ilable for use *
41c0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
41d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74 20          /* Stmt 
4200: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4210: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71  on */.  int bSeq
4220: 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74   = ((pSort->sort
4230: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
4240: 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b  _UseSorter)==0);
4250: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70  .  int nExpr = p
4260: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
4270: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
4280: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52      /* No. of OR
4290: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
42a0: 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45    int nBase = nE
42b0: 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44 61  xpr + bSeq + nDa
42c0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
42d0: 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20     /* Fields in 
42e0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
42f0: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72 20      /* Regs for 
4330: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
4340: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
4350: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
4360: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4370: 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64      /* Assembled
4380: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4390: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  /.  int nOBSat =
43a0: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20   pSort->nOBSat; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59       /* ORDER BY
43d0: 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a   terms to skip *
43e0: 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
4410: 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20 72   to add sorter r
4420: 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72 20  ecord to sorter 
4430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53  */..  assert( bS
4440: 65 71 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31  eq==0 || bSeq==1
4450: 20 29 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69   );.  if( nPrefi
4460: 78 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65  xReg ){.    asse
4470: 72 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  rt( nPrefixReg==
4480: 6e 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20  nExpr+bSeq );.  
4490: 20 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44    regBase = regD
44a0: 61 74 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53  ata - nExpr - bS
44b0: 65 71 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eq;.  }else{.   
44c0: 20 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73   regBase = pPars
44d0: 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
44e0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
44f0: 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20 73 71   nBase;.  }.  sq
4500: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
4510: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
4520: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72  ort->pOrderBy, r
4530: 65 67 42 61 73 65 2c 20 53 51 4c 49 54 45 5f 45  egBase, SQLITE_E
4540: 43 45 4c 5f 44 55 50 29 3b 0a 20 20 69 66 28 20  CEL_DUP);.  if( 
4550: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
4560: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4570: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
4580: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
4590: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
45a0: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
45b0: 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Reg==0 ){.    sq
45c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
45d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74  e(pParse, regDat
45e0: 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  a, regBase+nExpr
45f0: 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20  +bSeq, nData);. 
4600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
4610: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4620: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
4630: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
4640: 6e 4f 42 53 61 74 2c 20 72 65 67 52 65 63 6f 72  nOBSat, regRecor
4650: 64 29 3b 0a 20 20 69 66 28 20 6e 4f 42 53 61 74  d);.  if( nOBSat
4660: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  >0 ){.    int re
4670: 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54  gPrevKey;   /* T
4680: 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74 20  he first nOBSat 
4690: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 70  columns of the p
46a0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
46b0: 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73 74     int addrFirst
46c0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
46d0: 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20  of the OP_IfNot 
46e0: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e  opcode */.    in
46f0: 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20 20  t addrJmp;      
4700: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
4710: 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65  e OP_Jump opcode
4720: 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   */.    VdbeOp *
4730: 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63  pOp;      /* Opc
4740: 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20 74  ode that opens t
4750: 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
4760: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
4770: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4780: 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75  sorting key colu
4790: 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f  mns, including O
47a0: 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  P_Sequence */.  
47b0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20    KeyInfo *pKI; 
47c0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
47d0: 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73  KeyInfo on the s
47e0: 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a  orter table */..
47f0: 20 20 20 20 72 65 67 50 72 65 76 4b 65 79 20 3d      regPrevKey =
4800: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4810: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4820: 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  m += pSort->nOBS
4830: 61 74 3b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e  at;.    nKey = n
4840: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
4850: 42 53 61 74 20 2b 20 62 53 65 71 3b 0a 20 20 20  BSat + bSeq;.   
4860: 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20   if( bSeq ){.   
4870: 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20 73     addrFirst = s
4880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
4890: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
48a0: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20  gBase+nExpr); . 
48b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
48c0: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
48d0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
48e0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 54 65 73 74   OP_SequenceTest
48f0: 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  , pSort->iECurso
4900: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
4910: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
4920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4930: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
4940: 72 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20  re, regPrevKey, 
4950: 72 65 67 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e  regBase, pSort->
4960: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 70 4f 70  nOBSat);.    pOp
4970: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4980: 74 4f 70 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64  tOp(v, pSort->ad
4990: 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
49a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
49b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
49c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70   return;.    pOp
49d0: 2d 3e 70 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44  ->p2 = nKey + nD
49e0: 61 74 61 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70  ata;.    pKI = p
49f0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
4a00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d  .    memset(pKI-
4a10: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  >aSortOrder, 0, 
4a20: 70 4b 49 2d 3e 6e 46 69 65 6c 64 29 3b 20 2f 2a  pKI->nField); /*
4a30: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 62   Makes OP_Jump b
4a40: 65 6c 6f 77 20 74 65 73 74 61 62 6c 65 20 2a 2f  elow testable */
4a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4a60: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
4a70: 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f 4b  (char*)pKI, P4_K
4a80: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65 73  EYINFO);.    tes
4a90: 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 58 46 69  tcase( pKI->nXFi
4aa0: 65 6c 64 3e 32 20 29 3b 0a 20 20 20 20 70 4f 70  eld>2 );.    pOp
4ab0: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20  ->p4.pKeyInfo = 
4ac0: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4ad0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ist(pParse, pSor
4ae0: 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42  t->pOrderBy, nOB
4af0: 53 61 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Sat,.           
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 2d 31 29 3b  pKI->nXField-1);
4b30: 0a 20 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73  .    addrJmp = s
4b40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
4b50: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
4b60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b70: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
4b80: 4a 6d 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d  Jmp+1, 0, addrJm
4b90: 70 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  p+1); VdbeCovera
4ba0: 67 65 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74  ge(v);.    pSort
4bb0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73  ->labelBkOut = s
4bc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
4bd0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72  bel(v);.    pSor
4be0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  t->regReturn = +
4bf0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
4c00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4c10: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
4c20: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
4c30: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
4c40: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
4c50: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c60: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
4c70: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4c80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4c90: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
4ca0: 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 73 71  drFirst);.    sq
4cb0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
4cc0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
4cd0: 65 2c 20 72 65 67 50 72 65 76 4b 65 79 2c 20 70  e, regPrevKey, p
4ce0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
4cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
4d00: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 6d  mpHere(v, addrJm
4d10: 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  p);.  }.  if( pS
4d20: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
4d30: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
4d40: 74 65 72 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ter ){.    op = 
4d50: 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 3b  OP_SorterInsert;
4d60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70  .  }else{.    op
4d70: 20 3d 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b   = OP_IdxInsert;
4d80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
4d90: 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
4da0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
4db0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
4dc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
4dd0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
4de0: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
4df0: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
4e00: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
4e10: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
4e20: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4e30: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
4e40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
4e50: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
4e60: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
4e70: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
4e80: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4e90: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
4ea0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
4eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
4ed0: 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31  dImm, iLimit, -1
4ee0: 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
4ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
4f00: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
4f10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
4f20: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
4f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4f40: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
4f50: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
4f60: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
4f70: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4f80: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
4f90: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
4fa0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
4fb0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
4fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
4fd0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
4fe0: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
4ff0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
5000: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
5010: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
5020: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
5030: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
5040: 74 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20  t iOffset,      
5050: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5060: 69 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63  ing the offset c
5070: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5080: 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a  iContinue     /*
5090: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
50a0: 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ip the current r
50b0: 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ecord */.){.  if
50c0: 28 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  ( iOffset>0 ){. 
50d0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
50e0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
50f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5100: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 2c 20  IfNeg, iOffset, 
5110: 30 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65  0, -1); VdbeCove
5120: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5140: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
5150: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
5160: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
5170: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
5180: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
5190: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
51a0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
51b0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
51c0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
51d0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
51e0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
51f0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
5200: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
5210: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
5220: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
5230: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
5240: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
5250: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
5260: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
5270: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
5280: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
5290: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
52a0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
52b0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
52c0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
52d0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
52e0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
52f0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
5300: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
5310: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
5320: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
5330: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
5340: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
5350: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
5360: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
5370: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
5380: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
5390: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
53a0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
53b0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
53c0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
53d0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
53e0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
53f0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
5400: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
5410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5420: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
5430: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
5440: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5450: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
5460: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5470: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
5480: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
5490: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
54a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
54b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
54c0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
54d0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
54e0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
54f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
5500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5510: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
5520: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
5530: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5540: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5550: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
5560: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
5570: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
5580: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
5590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
55a0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
55b0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
55c0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
55d0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
55e0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
55f0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
5600: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
5610: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
5620: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
5630: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
5640: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
5650: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
5660: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
5670: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
5680: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
5690: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
56a0: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
56b0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
56c0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
56d0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
56e0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
56f0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
5700: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
5710: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
5720: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
5730: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5740: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
5750: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
5760: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
5770: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
5780: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
5790: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
57a0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
57b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
57c0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
57d0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
57e0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
57f0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
5800: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
5810: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
5820: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
5830: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
5840: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5850: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
5860: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
5870: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
5880: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
5890: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
58a0: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
58b0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
58c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
58d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
58e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
58f0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
5900: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
5910: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
5920: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
5930: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
5940: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
5950: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
5960: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
5970: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
5980: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5990: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
59a0: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
59b0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
59c0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
59d0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
59e0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
59f0: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
5a00: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
5a10: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
5a20: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
5a30: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
5a40: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
5a50: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
5a60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5a70: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
5a80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
5a90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
5aa0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5ab0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
5ac0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
5ad0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5ae0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
5af0: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
5b00: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
5b10: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b30: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
5b40: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
5b50: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
5b60: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
5b70: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
5b80: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52  ow to process OR
5b90: 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74  DER BY */.  Dist
5ba0: 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e  inctCtx *pDistin
5bb0: 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55  ct, /* If not NU
5bc0: 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20  LL, info on how 
5bd0: 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49  to process DISTI
5be0: 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  NCT */.  SelectD
5bf0: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
5c00: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5c10: 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  se of the result
5c20: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  s */.  int iCont
5c30: 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f  inue,          /
5c40: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63  * Jump here to c
5c50: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78  ontinue with nex
5c60: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
5c70: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
5c80: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
5c90: 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
5ca0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
5cb0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
5cc0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5cd0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68    int i;.  int h
5ce0: 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20  asDistinct;     
5cf0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5d00: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5d10: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
5d20: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
5d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5d40: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
5d50: 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  y holding result
5d60: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44   set */.  int eD
5d70: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
5d80: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
5d90: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
5da0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
5db0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
5dc0: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
5dd0: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
5de0: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
5df0: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5e10: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5e20: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
5e30: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
5e40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5e50: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
5e60: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
5e70: 73 75 6c 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sult */..  asser
5e80: 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74  t( v );.  assert
5e90: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
5ea0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70   hasDistinct = p
5eb0: 44 69 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74  Distinct ? pDist
5ec0: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
5ed0: 3a 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  : WHERE_DISTINCT
5ee0: 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f  _NOOP;.  if( pSo
5ef0: 72 74 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72  rt && pSort->pOr
5f00: 64 65 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74  derBy==0 ) pSort
5f10: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72   = 0;.  if( pSor
5f20: 74 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74  t==0 && !hasDist
5f30: 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65  inct ){.    asse
5f40: 72 74 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30  rt( iContinue!=0
5f50: 20 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   );.    codeOffs
5f60: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
5f70: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
5f80: 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65  }..  /* Pull the
5f90: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
5fa0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75  ns..  */.  nResu
5fb0: 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  ltCol = pEList->
5fc0: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
5fd0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
5fe0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
5ff0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
6000: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
6010: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
6020: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6030: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6040: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6050: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6060: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6070: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6090: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
60a0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
60b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
60c0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
60d0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
60e0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
60f0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
6100: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
6110: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
6120: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6130: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6140: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6150: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6160: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6170: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6180: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6190: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
61a0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
61b0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
61c0: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
61d0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
61e0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
61f0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
6200: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
6210: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
6220: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6230: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6240: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6250: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6260: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6270: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6280: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6290: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
62a0: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
62b0: 6f 6c 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20  ol;.  regResult 
62c0: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
62d0: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
62e0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
62f0: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
6300: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
6310: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6320: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
6330: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
6340: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
6350: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
6360: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6370: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
6380: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
6390: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
63a0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
63b0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
63c0: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
63d0: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
63e0: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
63f0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
6400: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
6410: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6430: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6440: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
6450: 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt,.            
6460: 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52        (eDest==SR
6470: 54 5f 4f 75 74 70 75 74 7c 7c 65 44 65 73 74 3d  T_Output||eDest=
6480: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 29 3f  =SRT_Coroutine)?
6490: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a  SQLITE_ECEL_DUP:
64a0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  0);.  }..  /* If
64b0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
64c0: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
64d0: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
64e0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
64f0: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
6500: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
6510: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
6520: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
6530: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
6540: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
6550: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
6560: 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74     switch( pDist
6570: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
6580: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
6590: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
65a0: 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
65b0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f          /* No lo
65d0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70  nger required Op
65e0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
65f0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  r. */.        in
6600: 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20  t iJump;        
6610: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
6620: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  stination */.   
6630: 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76       int regPrev
6640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6650: 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e  Previous row con
6660: 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tent */..       
6670: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
6680: 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ce for the previ
6690: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ous row */.     
66a0: 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
66b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
66c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
66d0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
66e0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ..        /* Cha
66f0: 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
6700: 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65  phemeral coded e
6710: 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f  arlier to an OP_
6720: 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  Null.        ** 
6730: 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65  sets the MEM_Cle
6740: 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20  ared bit on the 
6750: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f  first register o
6760: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
6770: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
6780: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
6790: 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f  e the OP_Ne belo
67a0: 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20  w to always.    
67b0: 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74      ** fail on t
67c0: 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
67d0: 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65  on of the loop e
67e0: 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ven if the first
67f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  .        ** row 
6800: 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20  is all NULLs..  
6810: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6820: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6830: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73  geToNoop(v, pDis
6840: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
6850: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20  ;.        pOp = 
6860: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6870: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
6880: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
6890: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
68a0: 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  OP_Null;.       
68b0: 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20   pOp->p1 = 1;.  
68c0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
68d0: 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  regPrev;..      
68e0: 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65    iJump = sqlite
68f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6900: 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c  (v) + nResultCol
6910: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
6920: 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b  0; i<nResultCol;
6930: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
6940: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
6950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
6960: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c  lSeq(pParse, pEL
6970: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6990: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29  i<nResultCol-1 )
69a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
69b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
69c0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
69d0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
69e0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
69f0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
6a00: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
6a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20  ddOp3(v, OP_Eq, 
6a40: 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f  regResult+i, iCo
6a50: 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65 76 2b  ntinue, regPrev+
6a60: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
6a70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
6a80: 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  .           }.  
6a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6aa0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
6ab0: 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  1, (const char *
6ac0: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
6ad0: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  EQ);.          s
6ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6af0: 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  P5(v, SQLITE_NUL
6b00: 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  LEQ);.        }.
6b10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6b20: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6b30: 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70  ntAddr(v)==iJump
6b40: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
6b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6b60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b70: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6b80: 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c 74 2c  Copy, regResult,
6b90: 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73 75 6c   regPrev, nResul
6ba0: 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  tCol-1);.       
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6bc0: 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
6bd0: 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
6be0: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  E: {.        sql
6bf0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6c00: 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  Noop(v, pDistinc
6c10: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
6c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6c30: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61     }..      defa
6c40: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 61  ult: {.        a
6c50: 73 73 65 72 74 28 20 70 44 69 73 74 69 6e 63 74  ssert( pDistinct
6c60: 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  ->eTnctType==WHE
6c70: 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
6c80: 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20  DERED );.       
6c90: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
6ca0: 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2d  arse, pDistinct-
6cb0: 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69  >tabTnct, iConti
6cc0: 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  nue, nResultCol,
6cd0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
6ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6cf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6d00: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
6d10: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
6d20: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
6d30: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
6d40: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
6d50: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
6d60: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
6d70: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
6d80: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
6d90: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
6da0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
6db0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
6dc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6dd0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
6de0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
6df0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
6e00: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
6e10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6e20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6e30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e40: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
6e50: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
6e60: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
6e70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6e80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6e90: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
6ea0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
6eb0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6ec0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
6ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6ee0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
6ef0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
6f00: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
6f10: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
6f20: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
6f30: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
6f40: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
6f50: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
6f60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
6f70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
6f80: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
6f90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
6fa0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
6fb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6fc0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
6fd0: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
6fe0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
6ff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7000: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7010: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7020: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
7030: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
7040: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
7050: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
7060: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
7070: 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  T_Fifo:.    case
7080: 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a 20   SRT_DistFifo:. 
7090: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
70a0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
70b0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
70c0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
70d0: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
70e0: 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52 65  Parse, nPrefixRe
70f0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  g+1);.      test
7100: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7110: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
7120: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7130: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
7140: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7150: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
7160: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
7170: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7180: 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65 67 29  , r1+nPrefixReg)
7190: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
71a0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20  _OMIT_CTE.      
71b0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
71c0: 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20 20 20  istFifo ){.     
71d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
71e0: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
71f0: 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f  Fifo, then curso
7200: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
7210: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
7220: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
7230: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
7240: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
7250: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
7260: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
7270: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
7280: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
7290: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
72a0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
72b0: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
72c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
72d0: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
72e0: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
72f0: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
7300: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
7310: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
7320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7330: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
7340: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7350: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7360: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
7370: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
7380: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
7390: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
73a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
73b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
73c0: 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20  Parm+1, r1);.   
73d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 6f       assert( pSo
73e0: 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  rt==0 );.      }
73f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
7400: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
7410: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
7420: 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  r(pParse, pSort,
7430: 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65   p, r1+nPrefixRe
7440: 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67  g, 1, nPrefixReg
7450: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7460: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
7470: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
7480: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
7490: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
74a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
74b0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
74c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
74d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
74e0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
74f0: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
7500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7510: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
7520: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
7530: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
7540: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
7550: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
7560: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
7570: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7580: 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67  , r1, nPrefixReg
7590: 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  +1);.      break
75a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
75b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
75c0: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
75d0: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
75e0: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
75f0: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
7600: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
7610: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
7620: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
7630: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
7640: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
7650: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
7660: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
7670: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
7680: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
7690: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
76a0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
76b0: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
76c0: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
76d0: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
76e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
76f0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
7700: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
7710: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
7720: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
7730: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
7740: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
7750: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
7760: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
7770: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
7780: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
7790: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
77a0: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
77b0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
77c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
77d0: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
77e0: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
77f0: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
7800: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
7810: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
7820: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
7830: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
7840: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
7850: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
7860: 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69  esult, 1, nPrefi
7870: 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xReg);.      }el
7880: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
7890: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
78a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
78b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
78c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
78d0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
78e0: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
78f0: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
7900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7910: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7920: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7930: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
7940: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7950: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7960: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7970: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
7980: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
7990: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
79a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
79b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
79c0: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
79d0: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
79e0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
79f0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
7a00: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
7a10: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
7a20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7a30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a40: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
7a50: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
7a60: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
7a70: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
7a80: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
7a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7aa0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
7ab0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
7ac0: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
7ad0: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
7ae0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
7af0: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
7b00: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
7b10: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
7b20: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
7b30: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
7b40: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
7b50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
7b60: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
7b70: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
7b80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7b90: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7ba0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7bb0: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7bc0: 65 67 52 65 73 75 6c 74 2c 20 31 2c 20 6e 50 72  egResult, 1, nPr
7bd0: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
7be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7bf0: 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74  ssert( regResult
7c00: 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20  ==iParm );.     
7c10: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
7c20: 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
7c30: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
7c40: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7c50: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7c60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
7c70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c80: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
7c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
7ca0: 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f  routine:       /
7cb0: 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61  * Send data to a
7cc0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
7cd0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
7ce0: 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20  ut: {        /* 
7cf0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
7d00: 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ts */.      test
7d10: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7d20: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
7d30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7d40: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
7d50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  );.      if( pSo
7d60: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7d70: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7d80: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7d90: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7da0: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
7db0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7dc0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  f( eDest==SRT_Co
7dd0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
7de0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7df0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
7e00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
7e10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7e40: 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65  ResultRow, regRe
7e50: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7e70: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
7e80: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
7e90: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7ea0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
7eb0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7ec0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
7ed0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7ee0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
7ef0: 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72  esults into a pr
7f00: 69 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61  iority queue tha
7f10: 74 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72  t is order accor
7f20: 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70  ding to.    ** p
7f30: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28  Dest->pOrderBy (
7f40: 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d  in pSO).  pDest-
7f50: 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61  >iSDParm (in iPa
7f60: 72 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f  rm) is the curso
7f70: 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  r for an.    ** 
7f80: 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e  index with pSO->
7f90: 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e  nExpr+2 columns.
7fa0: 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73    Build a key us
7fb0: 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20  ing pSO for the 
7fc0: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f  first.    ** pSO
7fd0: 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c  ->nExpr columns,
7fe0: 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
7ff0: 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69  all keys are uni
8000: 71 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a  que by adding a.
8010: 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f      ** final OP_
8020: 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e  Sequence column.
8030: 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d    The last colum
8040: 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20  n is the record 
8050: 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
8060: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  /.    case SRT_D
8070: 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61  istQueue:.    ca
8080: 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a  se SRT_Queue: {.
8090: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
80a0: 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
80b0: 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20  , r3;.      int 
80c0: 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20  addrTest = 0;.  
80d0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
80e0: 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70  O;.      pSO = p
80f0: 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  Dest->pOrderBy;.
8100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
8110: 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20  O );.      nKey 
8120: 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20  = pSO->nExpr;.  
8130: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
8140: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
8150: 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  e);.      r2 = s
8160: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
8170: 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b  ge(pParse, nKey+
8180: 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72  2);.      r3 = r
8190: 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20  2+nKey+1;.      
81a0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
81b0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
81c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
81d0: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73  stination is Dis
81e0: 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72  tQueue, then cur
81f0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
8200: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
8210: 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68   on a second eph
8220: 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61  emeral index tha
8230: 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75  t holds all valu
8240: 65 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75  es every previou
8250: 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  sly.        ** a
8260: 64 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75  dded to the queu
8270: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64  e. */.        ad
8280: 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  drTest = sqlite3
8290: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
82a0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d   OP_Found, iParm
82b0: 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  +1, 0, .        
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
82f0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8300: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8330: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8340: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8350: 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20  esultCol, r3);. 
8360: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
8370: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b  SRT_DistQueue ){
8380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8390: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
83a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83b0: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
83c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
83d0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
83e0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
83f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
8400: 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69  r(i=0; i<nKey; i
8410: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8430: 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20  , OP_SCopy,.    
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20        regResult 
8460: 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  + pSO->a[i].u.x.
8470: 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c  iOrderByCol - 1,
8480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8490: 20 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29             r2+i)
84a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
84b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84c0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
84d0: 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79  , iParm, r2+nKey
84e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
84f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8500: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c  _MakeRecord, r2,
8510: 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20   nKey+2, r1);.  
8520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8540: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
8550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64  );.      if( add
8560: 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33 56  rTest ) sqlite3V
8570: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
8580: 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20  ddrTest);.      
8590: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
85a0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
85b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
85c0: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
85d0: 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65  (pParse, r2, nKe
85e0: 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61  y+2);.      brea
85f0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
8600: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
8610: 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65  TE */....#if !de
8620: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8630: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
8640: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
8650: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
8660: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
8670: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
8680: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
8690: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
86a0: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
86b0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
86c0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
86d0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
86e0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
86f0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
8700: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
8710: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
8720: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
8730: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
8740: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
8750: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
8760: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63   eDest==SRT_Disc
8770: 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ard );.      bre
8780: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8790: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
87a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
87b0: 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
87c0: 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 20  MIT is reached. 
87d0: 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a   Except, if.  **
87e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72 74   there is a sort
87f0: 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  er, in which cas
8800: 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61 73  e the sorter has
8810: 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64   already limited
8820: 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  .  ** the output
8830: 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20   for us..  */.  
8840: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20  if( pSort==0 && 
8850: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
8860: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8870: 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
8880: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
8890: 61 6b 2c 20 2d 31 29 3b 20 56 64 62 65 43 6f 76  ak, -1); VdbeCov
88a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
88b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
88c0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
88d0: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
88e0: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
88f0: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
8900: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
8910: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
8920: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
8930: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
8940: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
8950: 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c  KeyInfo *p = sql
8960: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8970: 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (0, .           
8980: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b          sizeof(K
8990: 65 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a  eyInfo) + (N+X)*
89a0: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
89b0: 29 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29  )+1));.  if( p )
89c0: 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  {.    p->aSortOr
89d0: 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  der = (u8*)&p->a
89e0: 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70  Coll[N+X];.    p
89f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29  ->nField = (u16)
8a00: 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c  N;.    p->nXFiel
8a10: 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20  d = (u16)X;.    
8a20: 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
8a30: 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62  ;.    p->db = db
8a40: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
8a50: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
8a60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8a70: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
8a80: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn p;.}../*.** D
8a90: 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49  eallocate a KeyI
8aa0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  nfo object.*/.vo
8ab0: 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  id sqlite3KeyInf
8ac0: 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a  oUnref(KeyInfo *
8ad0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
8ae0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
8af0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
8b00: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8b10: 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69  ->nRef==0 ) sqli
8b20: 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b  te3DbFree(0, p);
8b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
8b40: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
8b50: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
8b60: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
8b70: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
8b80: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
8b90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
8ba0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
8bb0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
8bc0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
8bd0: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
8be0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
8bf0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
8c00: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
8c10: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
8c20: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
8c30: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
8c40: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
8c50: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
8c60: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
8c70: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
8c80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8c90: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
8ca0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
8cb0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
8cc0: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
8cd0: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
8ce0: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
8cf0: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
8d00: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
8d10: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
8d20: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
8d30: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
8d40: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
8d50: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
8d60: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
8d70: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
8d80: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
8d90: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
8da0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
8db0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
8dc0: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
8dd0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8de0: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
8df0: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
8e00: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
8e10: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
8e20: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
8e30: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
8e40: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
8e50: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
8e60: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
8e70: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
8e80: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
8e90: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
8ea0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
8eb0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
8ec0: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
8ed0: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
8ee0: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
8ef0: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
8f00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
8f10: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
8f20: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8f30: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
8f40: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
8f50: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
8f60: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
8f70: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
8f80: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
8f90: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
8fa0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
8fb0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
8fc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8fd0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8fe0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8ff0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9000: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9010: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9020: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9030: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
9040: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
9050: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
9060: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
9070: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
9080: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9090: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
90a0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
90b0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
90c0: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
90d0: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
90e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
90f0: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9100: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9110: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9120: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9130: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
9140: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9150: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
9160: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
9170: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
9180: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9190: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
91a0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
91b0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
91c0: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
91d0: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
91e0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
91f0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9200: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9210: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9220: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9230: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9240: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9250: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9260: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
9270: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9280: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9290: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
92a0: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
92b0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
92c0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
92d0: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
92e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
92f0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9300: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
9310: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9320: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9330: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9340: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9350: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9360: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9370: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9380: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9390: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
93a0: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
93b0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
93c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
93d0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
93e0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
93f0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9400: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9410: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9420: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9430: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9440: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9460: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9470: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9480: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
9490: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
94a0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
94b0: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
94c0: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
94d0: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
94e0: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
94f0: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
9500: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
9510: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
9520: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
9530: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
9540: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
9550: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
9560: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
9570: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
9580: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
9590: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
95a0: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
95b0: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
95c0: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
95d0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
95e0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
95f0: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
9600: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
9610: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
9620: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
9630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
9640: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
9650: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
9660: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
9670: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
9680: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
9690: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
96a0: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
96b0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
96c0: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
96d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
96e0: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
96f0: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
9700: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
9710: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
9720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
9730: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
9740: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
9750: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
9760: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
9770: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
9780: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
9790: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
97a0: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
97b0: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
97c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
97d0: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
97e0: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
97f0: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
9800: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
9810: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
9820: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
9830: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
9840: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
9850: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
9860: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
9870: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
9880: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
9890: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
98a0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
98b0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
98c0: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
98d0: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
98e0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
98f0: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
9900: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
9910: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
9920: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
9930: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9940: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
9950: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9960: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9970: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
9980: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
9990: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
99a0: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
99b0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
99c0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
99d0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
99e0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
99f0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
9a00: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
9a10: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
9a20: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
9a30: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
9a40: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
9a50: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
9a60: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
9a70: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
9a80: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
9a90: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
9aa0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
9ab0: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
9ac0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
9ad0: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
9ae0: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
9af0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
9b00: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
9b10: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
9b20: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
9b30: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
9b40: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
9b50: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
9b60: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
9b70: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
9b80: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
9b90: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
9ba0: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
9bb0: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
9bc0: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
9bd0: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
9be0: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
9bf0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
9c00: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
9c10: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
9c20: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
9c30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c50: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
9c60: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
9c90: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
9ca0: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
9cb0: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9cd0: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
9ce0: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
9d10: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
9d20: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
9d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9d40: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
9d50: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
9d60: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
9d70: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
9d80: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
9d90: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
9da0: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
9db0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
9dc0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
9dd0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
9de0: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
9df0: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
9e00: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
9e10: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
9e20: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
9e30: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
9e40: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
9e50: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
9e60: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
9e70: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
9e80: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
9e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9ea0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
9eb0: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
9ec0: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
9ed0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
9ee0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
9ef0: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
9f00: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
9f10: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
9f20: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
9f30: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
9f40: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
9f50: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
9f60: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
9f70: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
9f80: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
9f90: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
9fa0: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
9fb0: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
9fc0: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
9fd0: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
9fe0: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
9ff0: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
a000: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
a010: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
a020: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
a030: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
a040: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
a050: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
a060: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
a070: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
a080: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
a090: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
a0a0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a0b0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
a0c0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
a0d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a0e0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
a0f0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
a100: 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
a110: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
a120: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
a130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
a140: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
a150: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
a160: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
a170: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
a180: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ere */.){.  Vdbe
a190: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a1a0: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a1c0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
a1d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  nt */.  int addr
a1e0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
a1f0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
a200: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
a210: 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a  e to exit loop *
a220: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
a230: 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
a240: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
a250: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f   /* Jump here fo
a260: 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a  r next cycle */.
a270: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
a280: 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a  t addrOnce = 0;.
a290: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 45 78    int iTab;.  Ex
a2a0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
a2b0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
a2c0: 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  By;.  int eDest 
a2d0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
a2e0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
a2f0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20  est->iSDParm;.  
a300: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
a310: 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e  t regRowid;.  in
a320: 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53  t nKey;.  int iS
a330: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
a340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
a350: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
a360: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
a370: 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20   nSortData;     
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a390: 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20  Trailing values 
a3a0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72  to read from sor
a3b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ter */.  int i;.
a3c0: 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20    int bSeq;     
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72    /* True if sor
a3f0: 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75  ter record inclu
a400: 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a  des seq. no. */.
a410: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a420: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
a430: 4d 45 4e 54 53 0a 20 20 73 74 72 75 63 74 20 45  MENTS.  struct E
a440: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
a450: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
a460: 2d 3e 61 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ->a;.#endif..  i
a470: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a480: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  kOut ){.    sqli
a490: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a4a0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
a4b0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
a4c0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
a4d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a4e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
a4f0: 6f 2c 20 30 2c 20 61 64 64 72 42 72 65 61 6b 29  o, 0, addrBreak)
a500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
a510: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a520: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
a530: 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20  ut);.  }.  iTab 
a540: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
a550: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
a560: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
a570: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
a580: 6e 65 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  ne ){.    regRow
a590: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
a5a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
a5b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
a5c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
a5d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
a5e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
a5f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a600: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
a610: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a620: 61 72 73 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74  arse);.    nSort
a630: 44 61 74 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Data = 1;.  }.  
a640: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
a650: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
a660: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
a670: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
a680: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
a690: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
a6a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
a6b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
a6c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
a6d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
a6e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
a6f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
a700: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
a710: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
a720: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
a730: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
a740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
a750: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
a760: 20 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f   iSortTab, regSo
a770: 72 74 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53  rtOut, nKey+1+nS
a780: 6f 72 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ortData);.    if
a790: 28 20 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c  ( addrOnce ) sql
a7a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a7b0: 28 76 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20  (v, addrOnce);. 
a7c0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a7d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a7e0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
a7f0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
a800: 6b 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  k);.    VdbeCove
a810: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
a820: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
a830: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
a840: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
a850: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a860: 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54  P_SorterData, iT
a870: 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20  ab, regSortOut, 
a880: 69 53 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62  iSortTab);.    b
a890: 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Seq = 0;.  }else
a8a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  {.    addr = 1 +
a8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8c0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
a8d0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a8e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a8f0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
a900: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
a910: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
a920: 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54     iSortTab = iT
a930: 61 62 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31  ab;.    bSeq = 1
a940: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
a950: 20 69 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b   i<nSortData; i+
a960: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
a970: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a980: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
a990: 2c 20 6e 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72  , nKey+bSeq+i, r
a9a0: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64  egRow+i);.    Vd
a9b0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
a9c0: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
a9d0: 61 6d 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e  ame ? aOutEx[i].
a9e0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
a9f0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20  ].zSpan));.  }. 
aa00: 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29   switch( eDest )
aa10: 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  {.    case SRT_T
aa20: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
aa30: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
aa40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
aa50: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
aa60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
aa70: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
aa80: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
aa90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aaa0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
aab0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
aac0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
aad0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
aae0: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
aaf0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
ab00: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
ab10: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
ab20: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
ab30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ab40: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ab50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
ab60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
ab70: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
ab80: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ab90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aba0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
abb0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  akeRecord, regRo
abc0: 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a  w, 1, regRowid,.
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 20 20 20 20 20 20 26 70 44 65 73 74 2d 3e          &pDest->
abf0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
ac00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
ac10: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
ac20: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
ac30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
ac40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ac50: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
ac60: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
ac70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ac80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
ac90: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
aca0: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31  sert( nColumn==1
acb0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
acc0: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
acd0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50  arse, regRow, iP
ace0: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
acf0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
ad00: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
ad10: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
ad20: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
ad30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
ad40: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
ad50: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
ad60: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
ad70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
ad80: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
ad90: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
ada0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
adb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
adc0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
add0: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
ade0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
adf0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
ae00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ae10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
ae20: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
ae30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
ae40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
ae50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
ae60: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
ae70: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
ae80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aea0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
aeb0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
aec0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
aed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
aee0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
aef0: 69 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  id ){.    sqlite
af00: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
af10: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
af20: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
af30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
af40: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  e, regRowid);.  
af50: 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f  }.  /* The botto
af60: 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  m of the loop.  
af70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
af80: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
af90: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
afa0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
afb0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
afc0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
afd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afe0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
aff0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
b000: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
b010: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
b020: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b030: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
b040: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
b050: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
b060: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 72 65  .  if( pSort->re
b070: 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69 74 65  gReturn ) sqlite
b080: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
b090: 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  P_Return, pSort-
b0a0: 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 73  >regReturn);.  s
b0b0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b0c0: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72  eLabel(v, addrBr
b0d0: 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  eak);.}../*.** R
b0e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b0f0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
b100: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
b110: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
b120: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
b130: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
b140: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
b150: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
b160: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b170: 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65  ** Also try to e
b180: 73 74 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65  stimate the size
b190: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
b1a0: 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72   value and retur
b1b0: 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74  n that.** result
b1c0: 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a   in *pEstWidth..
b1d0: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  **.** The declar
b1e0: 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68  ation type is th
b1f0: 65 20 65 78 61 63 74 20 64 61 74 61 74 79 70 65  e exact datatype
b200: 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72   definition extr
b210: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  acted from the.*
b220: 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54  * original CREAT
b230: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
b240: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
b250: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
b260: 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74   The.** declarat
b270: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52  ion type for a R
b280: 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e  OWID field is IN
b290: 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77  TEGER. Exactly w
b2a0: 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  hen an expressio
b2b0: 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  n.** is consider
b2c0: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20  ed a column can 
b2d0: 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68  be complex in th
b2e0: 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75  e presence of su
b2f0: 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a  bqueries. The.**
b300: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
b310: 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66  ession in all of
b320: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
b330: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b340: 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   is .** consider
b350: 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74  ed a column by t
b360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
b370: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c  .**   SELECT col
b380: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
b390: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
b3a0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
b3b0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
b3c0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   col FROM tbl);.
b3d0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62 63 20  **   SELECT abc 
b3e0: 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c  FROM (SELECT col
b3f0: 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c   AS abc FROM tbl
b400: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65  );.** .** The de
b410: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
b420: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
b430: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  n other than a c
b440: 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a  olumn is NULL..*
b450: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b460: 65 20 68 61 73 20 65 69 74 68 65 72 20 33 20 6f  e has either 3 o
b470: 72 20 36 20 70 61 72 61 6d 65 74 65 72 73 20 64  r 6 parameters d
b480: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
b490: 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68  her or not.** th
b4a0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
b4b0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
b4c0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
b4d0: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a  ion is used..*/.
b4e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
b4f0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b500: 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f  DATA.# define co
b510: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
b520: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
b530: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Impl(A,B,C,D,E,F
b540: 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ).static const c
b550: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
b560: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
b570: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
b580: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
b590: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
b5a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b5b0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
b5c0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
b5d0: 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74  gCol,.  u8 *pEst
b5e0: 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20  Width.){.  char 
b5f0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
b600: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
b610: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
b620: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
b630: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73  rigCol = 0;.#els
b640: 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64  e /* if !defined
b650: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
b660: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
b670: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  */.# define colu
b680: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
b690: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
b6a0: 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63  pl(A,B,F).static
b6b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
b6c0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
b6d0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
b6e0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
b6f0: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
b700: 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .){.#endif /* !d
b710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
b720: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
b730: 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20  DATA) */.  char 
b740: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
b750: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20  ;.  int j;.  u8 
b760: 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20  estWidth = 1;.. 
b770: 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
b780: 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  ==0) || pNC->pSr
b790: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
b7a0: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
b7b0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b7c0: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
b7d0: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
b7e0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
b7f0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
b800: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c  n is a column. L
b810: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
b820: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65  the column is be
b830: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74  ing.      ** ext
b840: 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e  racted from in N
b850: 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c  ameContext.pSrcL
b860: 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20  ist. This table 
b870: 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20  may be real.    
b880: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61    ** database ta
b890: 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65 72  ble or a subquer
b8a0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
b8b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b8c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
b8d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
b8e0: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
b8f0: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
b900: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
b910: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
b920: 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c  * Select the col
b930: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
b940: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69   from */.      i
b950: 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d  nt iCol = pExpr-
b960: 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e  >iColumn;  /* In
b970: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
b980: 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74   pTab */.      t
b990: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
b9a0: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
b9b0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
b9c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b9d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
b9e0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
b9f0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
ba00: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
ba10: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
ba20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
ba30: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
ba40: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
ba50: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
ba60: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
ba70: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
ba80: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
ba90: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
baa0: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bab0: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bac0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
bad0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
bae0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
baf0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
bb00: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
bb10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
bb20: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
bb30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
bb40: 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64  At one time, cod
bb50: 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45 43  e such as "SELEC
bb60: 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20  T new.x" within 
bb70: 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a  a trigger would.
bb80: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
bb90: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
bba0: 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74  to run.  Since t
bbb0: 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73  hen, we have res
bbc0: 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20  tructured how.  
bbd0: 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
bbe0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
bbf0: 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63  ed and so this c
bc00: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c  ondition is no l
bc10: 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a  onger .        *
bc20: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65  * possible. Howe
bc30: 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c  ver, it can stil
bc40: 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73 74  l be true for st
bc50: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20  atements like.  
bc60: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
bc70: 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20  lowing:.        
bc80: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
bc90: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
bca0: 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20  col INTEGER);.  
bcb0: 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
bcc0: 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c  T (SELECT t1.col
bcd0: 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a  ) FROM FROM t1;.
bce0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
bcf0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d     ** when colum
bd00: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
bd10: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
bd20: 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20  ion "t1.col" in 
bd30: 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
bd40: 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74  sub-select. In t
bd50: 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74 68  his case, set th
bd60: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f  e column type to
bd70: 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20   NULL, even.    
bd80: 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74      ** though it
bd90: 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62   should really b
bda0: 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20  e "INTEGER"..   
bdb0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bdc0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
bdd0: 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65   problem, as the
bde0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20   column type of 
bdf0: 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65  "t1.col" is neve
be00: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  r.        ** use
be10: 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  d. When columnTy
be20: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
be30: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
be40: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53   .        ** "(S
be50: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20  ELECT t1.col)", 
be60: 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
be70: 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73 65   is returned (se
be80: 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a  e the TK_SELECT.
be90: 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63          ** branc
bea0: 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  h below.  */.   
beb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bec0: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
bed0: 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70 72  t( pTab && pExpr
bee0: 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a  ->pTab==pTab );.
bef0: 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a        if( pS ){.
bf00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22          /* The "
bf10: 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c  table" is actual
bf20: 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ly a sub-select 
bf30: 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68 65  or a view in the
bf40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20   FROM clause.   
bf50: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53       ** of the S
bf60: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
bf70: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
bf80: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
bf90: 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20   origin.        
bfa0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  ** data for the 
bfb0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
bfc0: 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  n of the sub-sel
bfd0: 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
bfe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
bff0: 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  >=0 && ALWAYS(iC
c000: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
c010: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c020: 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73     /* If iCol is
c030: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
c040: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
c050: 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68  sion requests th
c060: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  e.          ** r
c070: 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d  owid of the sub-
c080: 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
c090: 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
c0a0: 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20  is legal (see . 
c0b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74           ** test
c0c0: 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29   case misc2.2.2)
c0d0: 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61   - it always eva
c0e0: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a  luates to NULL..
c0f0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
c100: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
c110: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
c120: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
c130: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
c140: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
c150: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
c160: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
c170: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
c180: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pNC;.          s
c190: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
c1a0: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20  >pParse;.       
c1b0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
c1c0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a  nType(&sNC, p,&z
c1d0: 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62  OrigDb,&zOrigTab
c1e0: 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74  ,&zOrigCol, &est
c1f0: 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20  Width); .       
c200: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
c210: 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  f( pTab->pSchema
c220: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
c230: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
c240: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
c250: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
c260: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
c270: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
c280: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c290: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
c2a0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
c2b0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65  ->nCol) );.#ifde
c2c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c2d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c2e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
c2f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
c300: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
c310: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
c320: 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b  igCol = "rowid";
c330: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c340: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
c350: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
c360: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
c370: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
c380: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c390: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
c3a0: 20 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62   estWidth = pTab
c3b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45  ->aCol[iCol].szE
c3c0: 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  st;.        }.  
c3d0: 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d        zOrigTab =
c3e0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
c3f0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70        if( pNC->p
c400: 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  Parse ){.       
c410: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
c420: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
c430: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
c440: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
c450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
c460: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
c470: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
c480: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
c490: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  }.#else.        
c4a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
c4b0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
c4c0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
c4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c4e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
c4f0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
c500: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  pe;.          es
c510: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
c520: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
c530: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
c540: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
c550: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
c560: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c570: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
c580: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
c590: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c5a0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
c5b0: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
c5c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c5d0: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
c5e0: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
c5f0: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
c600: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
c610: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
c620: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
c630: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
c640: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
c650: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
c660: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
c670: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
c680: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
c690: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
c6a0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
c6b0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
c6c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
c6d0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
c6e0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
c6f0: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
c700: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
c710: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
c720: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
c730: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
c740: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
c750: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
c760: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
c770: 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a  l, &estWidth); .
c780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c790: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
c7a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c7b0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c7c0: 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72  ATA  .  if( pzOr
c7d0: 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65  igDb ){.    asse
c7e0: 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26  rt( pzOrigTab &&
c7f0: 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20   pzOrigCol );.  
c800: 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f    *pzOrigDb = zO
c810: 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  rigDb;.    *pzOr
c820: 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62  igTab = zOrigTab
c830: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c  ;.    *pzOrigCol
c840: 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d   = zOrigCol;.  }
c850: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
c860: 73 74 57 69 64 74 68 20 29 20 2a 70 45 73 74 57  stWidth ) *pEstW
c870: 69 64 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b  idth = estWidth;
c880: 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b  .  return zType;
c890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c8a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
c8b0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
c8c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c8d0: 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  types of columns
c8e0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
c8f0: 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  t set..*/.static
c900: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
c910: 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72  lumnTypes(.  Par
c920: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
c930: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
c940: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
c950: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
c960: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
c970: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
c980: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
c990: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
c9a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
c9b0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
c9c0: 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
c9d0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c9e0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
c9f0: 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t i;.  NameConte
ca00: 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53  xt sNC;.  sNC.pS
ca10: 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
ca20: 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20  t;.  sNC.pParse 
ca30: 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  = pParse;.  for(
ca40: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
ca50: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ca60: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
ca70: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
ca80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ca90: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
caa0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
cab0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
cac0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
cad0: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
cae0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
caf0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
cb00: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
cb10: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
cb20: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
cb30: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
cb40: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
cb50: 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  l, 0);..    /* T
cb60: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
cb70: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
cb80: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
cb90: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
cba0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
cbb0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
cbc0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
cbd0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
cbe0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
cbf0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
cc00: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
cc10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
cc20: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
cc30: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
cc40: 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45   zOrigDb, SQLITE
cc50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
cc60: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
cc70: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
cc80: 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69  NAME_TABLE, zOri
cc90: 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  gTab, SQLITE_TRA
cca0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ccb0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ccc0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ccd0: 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f  _COLUMN, zOrigCo
cce0: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
ccf0: 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ENT);.#else.    
cd00: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
cd10: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
cd20: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
cd30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
cd40: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
cd50: 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45  COLNAME_DECLTYPE
cd60: 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f  , zType, SQLITE_
cd70: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
cd80: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
cd90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
cda0: 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f  ECLTYPE) */.}../
cdb0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
cdc0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
cdd0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e  l the VDBE the n
cde0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ames of columns.
cdf0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
ce00: 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f   set.  This info
ce10: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
ce20: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a  to provide the.*
ce30: 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73  * azCol[] values
ce40: 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   in the callback
ce50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ce60: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
ce70: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
ce80: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
ce90: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
cea0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
ceb0: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
cec0: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
ced0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
cee0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
cef0: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
cf00: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  sult set */.){. 
cf10: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
cf20: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
cf30: 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20  i, j;.  sqlite3 
cf40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
cf50: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
cf60: 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a  s, shortNames;..
cf70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cf80: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a  MIT_EXPLAIN.  /*
cf90: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
cfa0: 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69  XPLAIN, skip thi
cfb0: 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20  s step */.  if( 
cfc0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
cfd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
cfe0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
cff0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
d000: 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d  sSet || NEVER(v=
d010: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
d020: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
d030: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
d040: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
d050: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
d060: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
d070: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
d080: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
d090: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d0a0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
d0b0: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
d0c0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
d0d0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
d0e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
d0f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
d100: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
d110: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
d120: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d130: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
d140: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d150: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
d160: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
d170: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
d180: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
d190: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
d1a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d1b0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d1c0: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
d1d0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
d1e0: 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f   }else if( (p->o
d1f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
d200: 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  p->op==TK_AGG_CO
d210: 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73  LUMN) && pTabLis
d220: 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  t ){.      Table
d230: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68   *pTab;.      ch
d240: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
d250: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
d260: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72  olumn;.      for
d270: 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70  (j=0; ALWAYS(j<p
d280: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20  TabList->nSrc); 
d290: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
d2a0: 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  ( pTabList->a[j]
d2b0: 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61  .iCursor==p->iTa
d2c0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
d2d0: 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
d2e0: 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  t( j<pTabList->n
d2f0: 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61  Src );.      pTa
d300: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
d310: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  j].pTab;.      i
d320: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
d330: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
d340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
d350: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
d360: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
d370: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
d380: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
d390: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
d3a0: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
d3b0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
d3c0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
d3d0: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
d3e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f  }.      if( !sho
d3f0: 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c  rtNames && !full
d400: 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
d410: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d420: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d430: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
d440: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
d450: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69  bStrDup(db, pELi
d460: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c  st->a[i].zSpan),
d470: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d490: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20  ( fullNames ){. 
d4a0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
d4b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
d4c0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
d4d0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
d4e0: 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
d4f0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   zCol);.        
d500: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d510: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d520: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
d530: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
d540: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d550: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d560: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d570: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
d580: 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52   zCol, SQLITE_TR
d590: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
d5a0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
d5b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d5c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
d5d0: 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d  zSpan;.      z =
d5e0: 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d   z==0 ? sqlite3M
d5f0: 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75  Printf(db, "colu
d600: 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71  mn%d", i+1) : sq
d610: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
d620: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
d630: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d640: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d650: 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f  NAME, z, SQLITE_
d660: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a  DYNAMIC);.    }.
d670: 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f    }.  generateCo
d680: 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65  lumnTypes(pParse
d690: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
d6a0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  st);.}../*.** Gi
d6b0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
d6c0: 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  n list (which is
d6d0: 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74   really the list
d6e0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
d6f0: 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ** that form the
d700: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
d710: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
d720: 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f  t) compute appro
d730: 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  priate.** column
d740: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62   names for a tab
d750: 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f  le that would ho
d760: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
d770: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  n list..**.** Al
d780: 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77  l column names w
d790: 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a  ill be unique..*
d7a0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f  *.** Only the co
d7b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63  lumn names are c
d7c0: 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e  omputed.  Column
d7d0: 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a  .zType, Column.z
d7e0: 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68  Coll,.** and oth
d7f0: 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c  er fields of Col
d800: 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  umn are zeroed..
d810: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
d820: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d830: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
d840: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
d850: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72   occurs,.** stor
d860: 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c  e NULL in *paCol
d870: 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c   and 0 in *pnCol
d880: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d890: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
d8a0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f  tic int selectCo
d8b0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
d8c0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
d8d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
d8e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d8f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d900: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
d910: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
d920: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
d930: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
d940: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
d950: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
d960: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d970: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
d980: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
d990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d9a0: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
d9b0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
d9c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d9d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
d9e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d9f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
da00: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
da10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
da20: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
da30: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
da50: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
da60: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
da70: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
da80: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
da90: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
daa0: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
dab0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
dac0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
dad0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dae0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
daf0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
db00: 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20    Expr *p;      
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db20: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
db30: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
db40: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
db50: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
db60: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
db70: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
db80: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
db90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
dba0: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
dbb0: 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c  [] */..  if( pEL
dbc0: 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
dbd0: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
dbe0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
dbf0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
dc00: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
dc10: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
dc20: 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
dc30: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
dc40: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61   nCol = 0;.    a
dc50: 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  Col = 0;.  }.  *
dc60: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
dc70: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
dc80: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
dc90: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
dca0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
dcb0: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
dcc0: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
dcd0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
dce0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
dcf0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
dd00: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
dd10: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  pr);.    if( (zN
dd20: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
dd30: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
dd40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
dd50: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
dd60: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
dd70: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
dd80: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
dd90: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
dda0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ddb0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
ddc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
ddd0: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
dde0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
ddf0: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
de00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
de10: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
de20: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
de30: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
de40: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
de50: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
de60: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
de70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
de80: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
de90: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
dea0: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
deb0: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
dec0: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
ded0: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
dee0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
def0: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
df00: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
df10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
df20: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
df30: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
df40: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
df50: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
df60: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
df70: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
df80: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
df90: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
dfa0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
dfb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
dfc0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
dfd0: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
dfe0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
dff0: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
e000: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
e010: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
e020: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
e030: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
e040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
e050: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e060: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
e070: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
e080: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e090: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
e0a0: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
e0b0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
e0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
e0d0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
e0e0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
e0f0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
e100: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
e110: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
e120: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
e130: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
e140: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
e150: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
e160: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e170: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
e180: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
e190: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
e1a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e1b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
e1c0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
e1d0: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
e1e0: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
e1f0: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
e200: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
e210: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
e220: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
e230: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d  .    */.    nNam
e240: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e250: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
e260: 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69  for(j=cnt=0; j<i
e270: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
e280: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e290: 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  (aCol[j].zName, 
e2a0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
e2b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e       char *zNewN
e2c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ame;.        int
e2d0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
e2e0: 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26  k=nName-1; k>1 &
e2f0: 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  & sqlite3Isdigit
e300: 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29  (zName[k]); k--)
e310: 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  {}.        if( k
e320: 3e 3d 30 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d  >=0 && zName[k]=
e330: 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b  =':' ) nName = k
e340: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
e350: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
e360: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
e370: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
e380: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
e390: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
e3a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e3b0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
e3c0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
e3d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
e3e0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
e3f0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
e400: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e410: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
e420: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
e430: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
e440: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
e450: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
e460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
e470: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
e480: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
e490: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e4a0: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
e4b0: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
e4c0: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
e4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e4e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e500: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
e510: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
e520: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
e530: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
e540: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
e550: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
e560: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
e570: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
e580: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
e590: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
e5a0: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
e5b0: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
e5c0: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
e5d0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
e5e0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
e5f0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
e600: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
e610: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
e620: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
e630: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
e640: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
e650: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
e660: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
e670: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
e680: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
e690: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
e6a0: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
e6b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e6c0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
e6d0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61  contexts */.  Ta
e6e0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
e6f0: 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d      /* Add colum
e700: 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69  n type informati
e710: 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  on to this table
e720: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e730: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53  elect       /* S
e740: 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65  ELECT used to de
e750: 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e  termine types an
e760: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a  d collations */.
e770: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e780: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
e790: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
e7a0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e7b0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
e7c0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  ll;.  int i;.  E
e7d0: 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74  xpr *p;.  struct
e7e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
e7f0: 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d  a;.  u64 szAll =
e800: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
e810: 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61  Select!=0 );.  a
e820: 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d  ssert( (pSelect-
e830: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
e840: 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20  esolved)!=0 );. 
e850: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e860: 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45  Col==pSelect->pE
e870: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64  List->nExpr || d
e880: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e890: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
e8a0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
e8b0: 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e  rn;.  memset(&sN
e8c0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
e8d0: 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  ));.  sNC.pSrcLi
e8e0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
e8f0: 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63  rc;.  a = pSelec
e900: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20  t->pEList->a;.  
e910: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(i=0, pCol=pT
e920: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62  ab->aCol; i<pTab
e930: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
e940: 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b  l++){.    p = a[
e950: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43  i].pExpr;.    pC
e960: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
e970: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e980: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
e990: 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d   p,0,0,0, &pCol-
e9a0: 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a  >szEst));.    sz
e9b0: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
e9c0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
e9d0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
e9e0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
e9f0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
ea00: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
ea10: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
ea20: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
ea30: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
ea40: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ea50: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
ea60: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
ea70: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73   pCol->zColl = s
ea80: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ea90: 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  b, pColl->zName)
eaa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54  ;.    }.  }.  pT
eab0: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
eac0: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41  qlite3LogEst(szA
ead0: 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ll*4);.}../*.** 
eae0: 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73  Given a SELECT s
eaf0: 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61  tatement, genera
eb00: 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  te a Table struc
eb10: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
eb20: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
eb30: 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45  t set of that SE
eb40: 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  LECT..*/.Table *
eb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
eb60: 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a  OfSelect(Parse *
eb70: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
eb80: 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c  pSelect){.  Tabl
eb90: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
eba0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
ebb0: 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  >db;.  int saved
ebc0: 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46  Flags;..  savedF
ebd0: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
ebe0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
ebf0: 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c   ~SQLITE_FullCol
ec00: 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  Names;.  db->fla
ec10: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
ec20: 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71  rtColNames;.  sq
ec30: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
ec40: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
ec50: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
ec60: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
ec70: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
ec80: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
ec90: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
eca0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e  ->pPrior;.  db->
ecb0: 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61  flags = savedFla
ecc0: 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  gs;.  pTab = sql
ecd0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
ece0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
ecf0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  e) );.  if( pTab
ed00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ed10: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  n 0;.  }.  /* Th
ed20: 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  e sqlite3ResultS
ed30: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20  etOfSelect() is 
ed40: 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74  only used n cont
ed50: 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61  exts where looka
ed60: 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73  side.  ** is dis
ed70: 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  abled */.  asser
ed80: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
ed90: 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a  .bEnabled==0 );.
eda0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
edb0: 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20  ;.  pTab->zName 
edc0: 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f  = 0;.  pTab->nRo
edd0: 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
ede0: 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
edf0: 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
ee00: 36 29 20 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f  6) );.  selectCo
ee10: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ee20: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
ee30: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
ee40: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
ee50: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
ee60: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
ee70: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
ee80: 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
ee90: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
eea0: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
eeb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
eec0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
eed0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
eee0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
eef0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
ef00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
ef10: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
ef20: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
ef30: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
ef40: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
ef50: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
ef60: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
ef70: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
ef80: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
ef90: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
efa0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
efb0: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
efc0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
efd0: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
efe0: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
eff0: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
f000: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
f010: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f020: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
f030: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69  AddOp0(v, OP_Ini
f040: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
f050: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
f060: 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
f070: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
f080: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
f090: 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
f0a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72     ){.      pPar
f0b0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
f0c0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  r = 1;.    }..  
f0d0: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
f0e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
f0f0: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
f100: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
f110: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
f120: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
f130: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
f140: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
f150: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
f160: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
f170: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
f180: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
f190: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
f1a0: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
f1b0: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
f1c0: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
f1d0: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
f1e0: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
f1f0: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
f200: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
f210: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
f220: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
f230: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
f240: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
f250: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
f260: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
f270: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
f280: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
f290: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
f2a0: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
f2b0: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
f2c0: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
f2d0: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
f2e0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
f2f0: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
f300: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
f310: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
f320: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
f330: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
f340: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
f350: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
f360: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
f370: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
f380: 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
f390: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
f3a0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
f3b0: 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
f3c0: 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
f3d0: 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
f3e0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
f3f0: 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
f400: 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
f410: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
f420: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
f430: 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
f440: 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
f450: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
f460: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
f470: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
f480: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
f490: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
f4a0: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
f4b0: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
f4c0: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
f4d0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
f4e0: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
f4f0: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
f500: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
f510: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
f520: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
f530: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
f540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f550: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
f560: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
f570: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
f580: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
f590: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
f5a0: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
f5b0: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
f5c0: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
f5d0: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
f5e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
f5f0: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
f600: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
f610: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
f620: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
f630: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
f640: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
f650: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
f660: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
f670: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
f680: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
f690: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
f6a0: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
f6b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
f6c0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
f6d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f6e0: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
f6f0: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
f700: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
f710: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
f720: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
f730: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
f740: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f750: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
f760: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
f770: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
f780: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
f790: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
f7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f7b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f7c0: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
f7d0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f7e0: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f7f0: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
f800: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
f810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f820: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f830: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
f840: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
f850: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
f860: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
f870: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
f880: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
f890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
f8b0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
f8c0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
f8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f8e0: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
f8f0: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
f900: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f910: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
f920: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
f930: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
f940: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f950: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
f960: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56  imit, iBreak); V
f970: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
f990: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
f9a0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
f9b0: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
f9c0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
f9d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
f9e0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
f9f0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
fa00: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
fa10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
fa20: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
fa30: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
fa40: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
fa50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fa60: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fa70: 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
fa80: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
fa90: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
faa0: 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
fab0: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
fac0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fad0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
fae0: 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
faf0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fb00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fb10: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
fb20: 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b  er, 0, iOffset);
fb30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb40: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
fb50: 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dr1);.      sqli
fb60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fb70: 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c   OP_Add, iLimit,
fb80: 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65   iOffset, iOffse
fb90: 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+1);.      Vdbe
fba0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
fbb0: 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20  IT+OFFSET"));.  
fbc0: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
fbd0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fbe0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69   OP_IfPos, iLimi
fbf0: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
fc00: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
fc10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
fc30: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
fc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
fc50: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
fc60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
fc70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc80: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
fc90: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
fca0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
fcb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
fcc0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
fcd0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
fce0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
fcf0: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
fd00: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
fd10: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
fd20: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
fd30: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
fd40: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
fd50: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
fd60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
fd70: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
fd80: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
fd90: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
fda0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
fdb0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
fdc0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
fdd0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
fde0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
fdf0: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
fe00: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
fe10: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
fe20: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
fe30: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
fe40: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
fe50: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
fe60: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
fe70: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
fe80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fe90: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
fea0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
feb0: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
fec0: 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69   && iCol<p->pELi
fed0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
fee0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
fef0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
ff00: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
ff10: 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
ff20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
ff30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
ff40: 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
ff50: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
ff60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
ff70: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
ff80: 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
ff90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
ffa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
ffb0: 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
ffc0: 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
ffd0: 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
ffe0: 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
fff0: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10000 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10010 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10020 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10030 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10040 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10050 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10060 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10070 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10080 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10090 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
100a0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
100b0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
100c0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
100d0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
100e0 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
100f0 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10100 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10110 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10120 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10130 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10140 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10150 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10160 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10170 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10180 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10190 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
101a0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
101b0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
101c0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
101d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
101e0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
101f0 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
10200 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
10210 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
10220 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
10230 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
10240 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
10250 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
10260 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
10270 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
10280 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
10290 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
102a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
102b0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
102c0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
102d0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
102e0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
102f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10300 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
10310 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
10320 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
10330 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
10340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10350 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
10360 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
10370 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
10380 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
10390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
103a0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
103b0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
103c0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
103d0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
103e0 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
103f0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
10400 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
10410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10420 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
10430 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10440 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
10450 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
10460 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
10470 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
10480 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
10490 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
104a0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
104b0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
104c0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
104d0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
104e0 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
104f0 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
10520 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
10530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
10540 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
10550 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
10560 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
10570 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
10580 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
10590 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
105a0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
105b0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
105c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
105d0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
105e0 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
105f0 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
10600 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65 20  a[].isRecursive 
10610 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
10620 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
10630 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
10640 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
10650 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
10660 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
10670 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
10680 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
10690 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
106a0 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
106b0 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
106c0 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
106d0 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
106e0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
106f0 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
10700 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
10710 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
10720 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
10730 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
10740 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
10750 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
10760 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
10770 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
10780 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
10790 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
107a0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
107b0 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
107c0 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
107d0 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
107e0 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
107f0 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
10800 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
10810 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
10820 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
10830 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
10840 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
10850 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
10860 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
10870 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
10880 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
10890 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
108a0 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
108b0 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
108c0 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
108d0 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
108e0 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
108f0 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
10900 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
10910 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
10920 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
10930 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
10940 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
10950 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
10960 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
10970 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
10980 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
10990 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
109a0 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
109b0 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
109c0 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
109d0 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
109e0 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
109f0 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
10a00 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
10a10 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
10a20 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
10a30 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
10a40 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
10a50 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
10a60 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
10a70 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
10a80 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
10a90 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
10aa0 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
10ab0 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
10ac0 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
10ad0 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
10ae0 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
10af0 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
10b00 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
10b10 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
10b20 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
10b30 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
10b40 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
10b50 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
10b60 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
10b70 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
10b80 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
10b90 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
10ba0 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
10bb0 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
10bc0 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
10bd0 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
10be0 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
10bf0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10c00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10c10 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10c30 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
10c40 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
10c50 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10c60 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
10c70 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
10c80 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
10c90 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
10ca0 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
10cb0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
10cc0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
10cd0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
10ce0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
10cf0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
10d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10d10 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
10d20 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
10d30 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
10d40 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
10d50 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
10d60 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
10d70 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
10d80 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
10d90 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
10da0 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
10db0 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
10dc0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
10dd0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
10de0 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
10df0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
10e00 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
10e10 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
10e20 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
10e30 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
10e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10e50 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
10e60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
10e70 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
10e80 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
10e90 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
10ea0 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
10eb0 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
10ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10ed0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10ee0 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
10ef0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10f00 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
10f10 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
10f20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
10f30 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
10f40 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
10f50 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
10f60 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
10f70 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
10f80 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
10f90 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
10fa0 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
10fb0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10fe0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
11010 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
11020 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
11030 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
11040 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
11050 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
11060 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
11070 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
11080 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
11090 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
110a0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
110b0 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
110c0 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
110d0 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
110e0 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
110f0 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
11100 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
11110 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
11120 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
11130 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
11140 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
11150 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
11160 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
11170 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
11180 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
11190 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
111a0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
111b0 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  v);.  computeLim
111c0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
111d0 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
111e0 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
111f0 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
11200 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
11210 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
11220 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
11230 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
11240 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
11250 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
11260 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
11270 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
11280 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
11290 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
112a0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
112b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
112c0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
112d0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
112e0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
112f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
11300 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75  Src->a[i].isRecu
11310 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
11320 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
11330 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
11340 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
11360 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
11370 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
11380 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
11390 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
113a0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
113b0 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
113c0 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
113d0 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
113e0 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
113f0 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
11400 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
11410 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
11420 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
11430 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
11440 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
11450 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
11460 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
11470 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
11480 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
11490 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
114a0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
114b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
114c0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
114d0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
114e0 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
114f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
11500 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
11510 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
11520 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
11530 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
11540 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
11550 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
11560 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
11570 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11580 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
11590 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
115a0 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
115b0 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
115c0 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
115d0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
115e0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
115f0 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
11600 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
11610 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
11620 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11630 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11640 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
11650 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
11660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11670 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
11680 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
11690 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
116a0 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
116b0 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
116c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
116d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
116e0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
116f0 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
11700 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11710 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
11720 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
11730 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
11740 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
11750 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11760 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
11770 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
11780 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
11790 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
117a0 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
117b0 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
117c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
117d0 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
117e0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
117f0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
11800 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
11810 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
11820 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
11830 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
11840 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
11850 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11860 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
11870 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
11880 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
11890 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
118a0 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
118b0 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
118c0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
118d0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
118e0 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
118f0 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
11900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11910 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
11920 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
11930 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
11940 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
11950 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
11960 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
11970 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
11980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11990 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
119a0 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
119b0 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
119c0 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
119d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
119e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
119f0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
11a00 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
11a10 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
11a20 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
11a30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11a40 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
11a50 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
11a60 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
11a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11a80 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
11a90 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
11aa0 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
11ab0 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
11ac0 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
11ad0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11ae0 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
11af0 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
11b00 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
11b10 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11b20 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11b30 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
11b40 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
11b50 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
11b60 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
11b70 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  egLimit ){.    s
11b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11b90 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 72  (v, OP_IfZero, r
11ba0 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65  egLimit, addrBre
11bb0 61 6b 2c 20 2d 31 29 3b 0a 20 20 20 20 56 64 62  ak, -1);.    Vdb
11bc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11bd0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
11be0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
11bf0 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
11c00 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
11c10 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
11c20 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
11c30 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
11c40 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
11c50 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
11c60 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
11c70 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
11c80 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
11c90 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11ca0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
11cb0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
11cc0 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28  ueue);.  assert(
11cd0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
11ce0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
11cf0 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Setup;..  /* Kee
11d00 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f  p running the lo
11d10 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  op until the Que
11d20 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ue is empty */. 
11d30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d40 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
11d50 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
11d60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
11d70 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
11d80 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63  ak);..end_of_rec
11d90 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20  ursive_query:.  
11da0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11db0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
11dc0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
11dd0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
11de0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
11df0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
11e00 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
11e10 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
11e20 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11e30 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
11e40 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
11e50 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
11e60 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
11e70 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
11e80 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11e90 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11ea0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11eb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11ec0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
11ed0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
11ee0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
11ef0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
11f00 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
11f10 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
11f20 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
11f30 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
11f40 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20  for when two or 
11f50 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20  more terms of a 
11f60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
11f70 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
11f80 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65  * size result se
11f90 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
11fa0 69 64 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75  id selectWrongNu
11fb0 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73  mTermsError(Pars
11fc0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
11fd0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
11fe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
11ff0 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lues ){.    sqli
12000 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12010 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
12020 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
12030 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
12040 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ms");.  }else{. 
12050 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12060 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
12070 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
12080 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
12090 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
120a0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
120b0 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
120c0 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
120d0 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
120e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64   }.}../*.** Hand
120f0 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12100 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12110 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12120 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12130 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12140 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12150 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12160 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12170 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12180 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12190 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
121a0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
121b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
121c0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
121d0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
121e0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
121f0 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12200 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12210 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12220 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12230 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12240 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12250 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12260 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12270 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12280 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12290 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
122a0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
122b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
122c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
122d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
122e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
122f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
12300 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
12310 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
12320 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
12330 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
12340 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
12350 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
12360 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
12370 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
12380 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e  ->nExpr;.  int n
12390 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
123a0 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
123b0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
123c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
123d0 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
123e0 6c 75 65 73 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  lues );.  do{.  
123f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
12400 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
12410 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
12420 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c   p->op==TK_ALL |
12430 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | (p->op==TK_SEL
12440 45 43 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ECT && p->pPrior
12450 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
12460 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
12470 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12480 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
12490 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  .    if( p->pELi
124a0 73 74 2d 3e 6e 45 78 70 72 21 3d 6e 45 78 70 72  st->nExpr!=nExpr
124b0 20 29 7b 0a 20 20 20 20 20 20 73 65 6c 65 63 74   ){.      select
124c0 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
124d0 6f 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  or(pParse, p);. 
124e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
124f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
12500 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
12510 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
12520 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
12530 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
12540 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
12550 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
12560 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
12570 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
12580 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
12590 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
125a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
125b0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
125c0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
125d0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
125e0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
125f0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
12600 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
12610 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12620 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12630 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12640 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
12650 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
12660 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
12670 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
12680 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
12690 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
126a0 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
126b0 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
126c0 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
126d0 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
126e0 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
126f0 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
12700 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
12710 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
12720 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
12730 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
12740 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
12750 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
12760 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
12770 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
12780 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
12790 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
127a0 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
127b0 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
127c0 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
127d0 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
127e0 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
127f0 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
12800 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
12810 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
12820 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
12830 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
12840 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
12850 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
12860 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
12870 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
12880 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
12890 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
128a0 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
128b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
128c0 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
128d0 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
128e0 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
128f0 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
12910 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12920 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
12930 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
12940 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
12950 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
12960 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
12970 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
12980 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
12990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
129a0 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
129b0 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
129c0 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
129d0 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
129e0 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
129f0 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
12a00 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
12a10 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
12a20 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
12a30 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
12a40 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
12a50 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
12a60 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
12a70 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
12a80 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
12a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12aa0 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
12ab0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12ac0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12ad0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
12ae0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
12af0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
12b00 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
12b10 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
12b20 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
12b30 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
12b40 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
12b50 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
12b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12b70 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
12b80 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
12b90 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
12ba0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
12bb0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
12bc0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
12bd0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
12be0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12bf0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
12c00 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
12c10 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
12c20 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
12c30 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
12c40 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
12c50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
12c60 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
12c70 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
12c80 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
12c90 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
12ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
12cb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12cc0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12cd0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
12ce0 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b    int iSub1 = 0;
12cf0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
12d00 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
12d10 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
12d20 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub2 = 0;        
12d30 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
12d40 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
12d50 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
12d60 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
12d70 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
12d80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
12d90 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
12da0 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
12db0 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
12dc0 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
12dd0 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
12de0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
12df0 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
12e00 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
12e10 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
12e20 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
12e30 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
12e40 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
12e50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
12e60 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
12e70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
12e80 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12e90 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
12ea0 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
12eb0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65   p->pPrior;.  de
12ec0 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
12ed0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
12ee0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
12ef0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12f00 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
12f10 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12f20 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12f30 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12f40 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12f50 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12f60 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12f70 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
12f80 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
12f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
12fa0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
12fb0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
12fc0 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
12fd0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
12fe0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
12ff0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
13000 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
13010 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
13020 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
13030 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
13040 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
13050 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
13060 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
13070 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
13080 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
13090 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
130a0 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
130b0 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
130c0 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
130d0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
130e0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
130f0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13100 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
13110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13120 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13130 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
13140 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
13150 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13160 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
13170 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
13180 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
13190 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
131a0 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64   /* Special hand
131b0 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f  ling for a compo
131c0 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
131d0 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20  originates as a 
131e0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20  VALUES clause.. 
131f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
13200 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 56 61  Flags & SF_AllVa
13210 6c 75 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d  lues ){.    rc =
13220 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13230 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13240 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13250 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13270 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13280 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13290 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
132a0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
132b0 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
132c0 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
132d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
132e0 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
132f0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
13300 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
13310 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
13320 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
13330 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54   selectWrongNumT
13340 65 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65  ermsError(pParse
13350 2c 20 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  , p);.    rc = 1
13360 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
13370 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
13380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13390 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
133a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
133b0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
133c0 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
133d0 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
133e0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
133f0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
13400 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
13410 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
13420 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
13430 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
13440 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
13450 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
13460 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
13470 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
13480 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
13490 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
134a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
134b0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
134c0 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
134d0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
134e0 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
134f0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
13500 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
13510 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
13520 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
13530 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
13540 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
13550 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
13560 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
13570 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
13580 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
13590 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
135a0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
135b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
135c0 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
135d0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
135e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
135f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
13600 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
13610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13620 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
13630 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
13640 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
13650 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
13660 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13670 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
13680 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
13690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
136a0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
136b0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
136c0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
136d0 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
136e0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
136f0 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
13700 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
13710 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
13720 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
13730 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a  AddOp1(v, OP_IfZ
13740 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  ero, p->iLimit);
13750 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
13760 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
13770 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
13780 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
13790 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
137a0 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
137b0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
137c0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
137d0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
137e0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
137f0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
13800 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
13810 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
13820 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
13830 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
13840 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
13850 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
13860 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13870 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
13880 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
13890 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
138a0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
138b0 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
138c0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
138d0 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
138e0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
138f0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
13900 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
13910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
13920 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
13930 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
13940 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13960 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13970 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
13980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
13990 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
139a0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
139b0 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
139c0 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
139d0 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
139e0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
139f0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
13a00 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
13a10 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
13a20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
13a30 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
13a40 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
13a50 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
13a60 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
13a70 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
13a80 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
13a90 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
13aa0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
13ab0 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
13ac0 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
13ad0 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
13ae0 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
13af0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
13b00 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
13b10 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
13b20 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
13b30 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
13b40 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
13b50 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
13b60 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
13b70 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
13b80 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
13b90 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
13ba0 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
13bb0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
13bc0 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
13bd0 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
13be0 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
13bf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
13c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
13c10 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
13c20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
13c30 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
13c40 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13c50 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
13c60 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
13c70 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
13c80 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
13c90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
13ca0 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
13cb0 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
13cc0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
13cd0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
13ce0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
13cf0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
13d00 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
13d10 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
13d20 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
13d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
13d40 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
13d50 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
13d60 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
13d70 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
13d80 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
13d90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13da0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
13db0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
13dc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13dd0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
13de0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
13df0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
13e00 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
13e10 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
13e20 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
13e30 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
13e40 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
13e50 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
13e60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13e70 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
13e80 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
13e90 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
13ea0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13eb0 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
13ec0 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
13ed0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
13ee0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
13ef0 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
13f00 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
13f10 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
13f20 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
13f30 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
13f40 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13f50 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
13f60 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
13f70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
13f80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
13f90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13fa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13fb0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
13fc0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
13fd0 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
13fe0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
13ff0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
14000 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
14010 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
14020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14030 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14040 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
14050 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14060 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
14070 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
14080 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
14090 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
140a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
140b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
140c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
140d0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
140e0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
140f0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
14100 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14110 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
14120 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14140 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
14150 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
14160 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14180 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
14190 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
141a0 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
141b0 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
141c0 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
141d0 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
141e0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
141f0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
14200 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
14210 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
14220 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
14230 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
14240 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
14250 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
14260 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
14270 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14280 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
14290 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
142a0 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
142b0 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
142c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
142d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
142e0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
142f0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14300 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14310 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14320 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
14330 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
14340 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
14350 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
14360 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
14370 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
14380 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
14390 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
143a0 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
143b0 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
143c0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
143d0 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
143e0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
143f0 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
14400 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
14410 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
14420 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14430 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
14440 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
14450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14460 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
14470 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
14480 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
14490 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
144a0 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
144b0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
144c0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
144d0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
144e0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
144f0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
14500 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
14510 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
14520 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
14530 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
14540 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
14550 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
14560 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
14570 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14580 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
14590 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
145a0 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
145b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
145c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
145d0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
145e0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
145f0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14600 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
14610 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14620 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
14630 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
14640 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
14650 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54  ->pEList, unionT
14660 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
14670 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
14680 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
14690 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
146a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
146b0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
146c0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
146d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
146e0 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54   OP_Next, unionT
146f0 61 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62  ab, iStart); Vdb
14700 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
14710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14720 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14730 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14750 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
14760 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
14770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14780 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14790 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70  fault: assert( p
147a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ->op==TK_INTERSE
147b0 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  CT ); {.      in
147c0 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20  t tab1, tab2;.  
147d0 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
147e0 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
147f0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14800 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20  t, *pOffset;.   
14810 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
14820 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e     SelectDest in
14830 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20  tersectdest;.   
14840 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20     int r1;..    
14850 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69    /* INTERSECT i
14860 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
14870 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63   the others sinc
14880 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20  e it requires.  
14890 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f      ** two tempo
148a0 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65  rary tables.  He
148b0 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f  nce it has its o
148c0 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a  wn case.  Begin.
148d0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
148e0 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
148f0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
14900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
14910 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab1 = pParse->nT
14920 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32  ab++;.      tab2
14930 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14940 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
14950 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
14960 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d  );..      addr =
14970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14980 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
14990 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29  emeral, tab1, 0)
149a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149b0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
149c0 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
149d0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
149e0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
149f0 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
14a00 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
14a10 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
14a20 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
14a30 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
14a40 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14a50 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
14a60 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
14a70 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
14a80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14a90 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14aa0 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
14ab0 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
14ac0 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65  , tab1);.      e
14ad0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14ae0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14af0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14b00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b10 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14b20 20 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73   pPrior, &inters
14b30 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
14b40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14b50 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14b60 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14b70 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b80 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14b90 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  CT into temporar
14ba0 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20  y table "tab2". 
14bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
14bc0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14bd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
14be0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32  nEphemeral, tab2
14bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
14c00 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
14c10 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[1] == -1 );.
14c20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
14c30 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b  nEphm[1] = addr;
14c40 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14c50 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
14c60 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
14c70 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
14c80 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
14c90 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
14ca0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
14cb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
14cc0 65 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61  ersectdest.iSDPa
14cd0 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20  rm = tab2;.     
14ce0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14cf0 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14d00 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14d10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14d20 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14d30 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
14d40 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14d50 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14d60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44  E_OK );.      pD
14d70 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14d80 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14d90 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14da0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
14db0 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
14dc0 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65  lectRow ) p->nSe
14dd0 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
14de0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
14df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
14e00 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14e10 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
14e20 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
14e30 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
14e40 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20   = pOffset;..   
14e50 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
14e60 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20  ode to take the 
14e70 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20  intersection of 
14e80 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72  the two temporar
14e90 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  y.      ** table
14ea0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14eb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
14ec0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ist );.      if(
14ed0 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
14ee0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
14ef0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
14f00 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77  t = p;.        w
14f10 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
14f20 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
14f30 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
14f40 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
14f50 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
14f60 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
14f70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  EList);.      }.
14f80 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
14f90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14fa0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
14fb0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
14fc0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
14fd0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
14fe0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14ff0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
15000 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15020 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
15030 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
15040 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  (v);.      r1 = 
15050 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
15060 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
15070 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
15080 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15090 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
150a0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
150b0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
150c0 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
150d0 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c  tab2, iCont, r1,
150e0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
150f0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
15100 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15110 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
15120 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15130 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15140 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c  p->pEList, tab1,
15150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15160 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
15170 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
15180 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
15190 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
151a0 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
151b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
151c0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
151d0 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20   tab1, iStart); 
151e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
151f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15200 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15210 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15230 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
15240 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
15250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15260 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15270 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
15280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
15290 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
152a0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
152b0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
152c0 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b   p->op!=TK_ALL);
152d0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63  ..  /* Compute c
152e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
152f0 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  es used by .  **
15300 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15310 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c  s needed to impl
15320 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75  ement the compou
15330 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20  nd select..  ** 
15340 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e  Attach the KeyIn
15350 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  fo structure to 
15360 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61  all temporary ta
15370 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
15380 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20  This section is 
15390 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74  run by the right
153a0 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
153b0 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a  tement only..  *
153c0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
153d0 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  nts to the left 
153e0 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73  always skip this
153f0 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68   part.  The righ
15400 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45  t-most.  ** SELE
15410 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b  CT might also sk
15420 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20  ip this part if 
15430 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20  it has no ORDER 
15440 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20  BY clause and.  
15450 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65  ** no temp table
15460 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a  s are required..
15470 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
15480 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73  lFlags & SF_Uses
15490 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20  Ephemeral ){.   
154a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
154c0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
154d0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
154e0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
154f0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
15500 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
15510 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
15520 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
15530 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15540 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
15550 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
15560 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
15570 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
15580 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
15590 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
155a0 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
155b0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
155c0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
155d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
155f0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
15600 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
15610 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   p->pNext==0 );.
15620 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45      nCol = p->pE
15630 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
15640 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
15650 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
15660 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20  db, nCol, 1);.  
15670 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
15680 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15690 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
156a0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
156b0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
156c0 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f     for(i=0, apCo
156d0 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ll=pKeyInfo->aCo
156e0 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ll; i<nCol; i++,
156f0 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20   apColl++){.    
15700 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74    *apColl = mult
15710 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
15720 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
15730 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f      if( 0==*apCo
15740 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61  ll ){.        *a
15750 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
15760 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
15770 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c     }..    for(pL
15780 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
15790 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
157a0 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r){.      for(i=
157b0 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<2; i++){.  
157c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
157d0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
157e0 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Ephm[i];.       
157f0 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
15800 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b           /* If [
15810 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65  0] is unused the
15820 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e  n [1] is also un
15830 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  used.  So we can
15840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  .          ** al
15850 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72  ways safely abor
15860 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  t as soon as the
15870 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c   first unused sl
15880 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ot is found */. 
15890 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
158a0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
158b0 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20  Ephm[1]<0 );.   
158c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
158d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
158e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
158f0 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f  eP2(v, addr, nCo
15900 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
15910 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
15920 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29  v, addr, (char*)
15930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15940 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20  f(pKeyInfo),.   
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
15970 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  NFO);.        pL
15980 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
15990 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20  m[i] = -1;.     
159a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
159b0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
159c0 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a  (pKeyInfo);.  }.
159d0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
159e0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
159f0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
15a00 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
15a10 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
15a20 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
15a30 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
15a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15a50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15a60 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
15a70 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
15a80 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
15a90 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
15aa0 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
15ab0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
15ac0 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
15ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
15ae0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
15af0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
15b00 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
15b10 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
15b20 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
15b30 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
15b40 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
15b50 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
15b60 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
15b70 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
15b80 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
15b90 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
15ba0 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
15bb0 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
15bc0 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
15bd0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
15be0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
15bf0 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
15c00 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
15c10 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
15c20 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
15c30 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
15c40 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
15c50 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
15c60 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
15c70 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
15c80 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
15c90 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
15ca0 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
15cb0 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
15cc0 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
15cd0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
15ce0 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
15cf0 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
15d00 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
15d10 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
15d20 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
15d30 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
15d40 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
15d50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15d60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
15d70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15d80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15da0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
15db0 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
15dc0 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
15dd0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
15de0 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
15df0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
15e00 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
15e10 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
15e20 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
15e30 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
15e40 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
15e50 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
15e60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
15e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
15e80 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
15e90 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
15ea0 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
15eb0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
15ec0 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
15ed0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
15ee0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
15ef0 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f10 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
15f20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
15f30 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
15f40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
15f50 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
15f60 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
15f70 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
15f80 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15f90 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
15fa0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15fb0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
15fc0 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
15fd0 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
15fe0 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
15ff0 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
16000 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
16010 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31  t j1, j2;.    j1
16020 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16030 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
16040 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62 65  , regPrev); Vdbe
16050 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16060 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
16070 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
16080 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
16090 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
160a0 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73          (char*)s
160d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
160e0 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b  (pKeyInfo), P4_K
160f0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
16100 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16110 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c  , OP_Jump, j2+2,
16120 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32   iContinue, j2+2
16130 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16140 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
16150 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
16160 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16170 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16180 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
16190 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
161a0 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
161b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161c0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
161d0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
161e0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
161f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16200 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
16210 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
16220 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
16230 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
16240 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
16250 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
16260 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
16270 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  t, iContinue);..
16280 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
16290 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
162a0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
162b0 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
162c0 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
162d0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
162e0 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
162f0 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
16300 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
16310 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16320 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
16330 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
16340 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
16350 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
16360 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65  case( pDest->eDe
16370 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
16380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16390 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
163a0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
163b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
163c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
163d0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
163e0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
163f0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
16400 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16410 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
16420 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32  est->iSDParm, r2
16430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16440 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16450 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  _Insert, pDest->
16460 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  iSDParm, r1, r2)
16470 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16480 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16490 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
164a0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
164b0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
164c0 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
164d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
164e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
164f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16500 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16510 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16520 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
16530 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
16540 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
16550 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
16560 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
16570 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
16580 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
16590 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
165a0 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
165b0 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
165c0 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
165d0 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
165e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
165f0 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
16600 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
16610 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
16620 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
16630 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20  st->affSdst = . 
16640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
16650 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
16660 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
16670 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
16680 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20  Sdst);.      r1 
16690 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
166a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
166b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166c0 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
166d0 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73  ecord, pIn->iSds
166e0 74 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74  t, 1, r1, &pDest
166f0 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20  ->affSdst,1);.  
16700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16710 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16720 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
16730 69 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  iSdst, 1);.     
16740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16750 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
16760 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
16770 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
16780 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16790 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
167a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
167b0 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20     }..#if 0  /* 
167c0 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20  Never occurs on 
167d0 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72  an ORDER BY quer
167e0 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61  y */.    /* If a
167f0 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20  ny row exist in 
16800 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
16810 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74  record that fact
16820 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20   and abort..    
16830 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
16840 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20  Exists: {.      
16850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16860 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
16870 20 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61   1, pDest->iSDPa
16880 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
16890 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
168a0 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
168b0 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
168c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
168d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
168e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
168f0 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
16900 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
16910 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
16920 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
16930 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
16940 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
16950 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
16960 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
16970 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
16980 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16990 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
169a0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
169b0 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
169c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
169d0 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
169e0 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
169f0 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  iSDParm, 1);.   
16a00 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
16a10 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70  clause will jump
16a20 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
16a30 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
16a40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16a50 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
16a60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
16a70 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  UERY */..    /* 
16a80 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
16a90 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
16aa0 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
16ab0 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e  s.    ** startin
16ac0 67 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73  g at pDest->iSds
16ad0 74 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  t.  Then the co-
16ae0 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
16af0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16b00 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
16b10 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
16b20 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20  ->iSdst==0 ){.  
16b30 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64        pDest->iSd
16b40 73 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  st = sqlite3GetT
16b50 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
16b60 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
16b70 20 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64        pDest->nSd
16b80 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b  st = pIn->nSdst;
16b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16ba0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
16bb0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
16bc0 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
16bd0 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73  dst, pDest->nSds
16be0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
16bf0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16c00 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
16c10 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
16c20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
16c30 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20    /* If none of 
16c40 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  the above, then 
16c50 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69  the result desti
16c60 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20  nation must be. 
16c70 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74     ** SRT_Output
16c80 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16c90 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
16ca0 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20  with any other. 
16cb0 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f     ** destinatio
16cc0 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  n other than the
16cd0 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62   ones handled ab
16ce0 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75  ove or SRT_Outpu
16cf0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
16d00 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c   For SRT_Output,
16d10 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
16d20 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
16d30 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20  e of registers. 
16d40 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68   .    ** Then th
16d50 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  e OP_ResultRow o
16d60 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
16d70 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
16d80 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  tep() to.    ** 
16d90 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20  return the next 
16da0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
16db0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
16dc0 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
16dd0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  t( pDest->eDest=
16de0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
16df0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16e00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
16e10 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64  ultRow, pIn->iSd
16e20 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
16e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
16e40 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
16e50 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
16e60 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
16e70 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Sdst);.      bre
16e80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
16e90 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
16ea0 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  end of the loop 
16eb0 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20  if the LIMIT is 
16ec0 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20  reached..  */.  
16ed0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
16ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16ef0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a  AddOp3(v, OP_IfZ
16f00 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
16f10 69 42 72 65 61 6b 2c 20 2d 31 29 3b 20 56 64 62  iBreak, -1); Vdb
16f20 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16f30 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
16f40 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
16f50 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
16f60 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
16f70 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e  Label(v, iContin
16f80 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ue);.  sqlite3Vd
16f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
16fa0 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e  eturn, regReturn
16fb0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64  );..  return add
16fc0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65  r;.}../*.** Alte
16fd0 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64  rnative compound
16fe0 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e   select code gen
16ff0 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73  erator for cases
17000 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69   when there.** i
17010 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
17020 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  ause..**.** We a
17030 73 73 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66  ssume a query of
17040 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
17050 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
17060 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72  <selectA>  <oper
17070 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e  ator>  <selectB>
17080 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65    ORDER BY <orde
17090 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c  rbylist>.**.** <
170a0 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65  operator> is one
170b0 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55   of UNION ALL, U
170c0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
170d0 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65   INTERSECT.  The
170e0 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63   idea.** is to c
170f0 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74  ode both <select
17100 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e  A> and <selectB>
17110 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
17120 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20  BY clause as.** 
17130 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68  co-routines.  Th
17140 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f  en run the co-ro
17150 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c  utines in parall
17160 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65  el and merge the
17170 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
17180 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e   the output.  In
17190 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
171a0 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
171b0 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20  (called selectA 
171c0 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20  and.** selectB) 
171d0 74 68 65 72 65 20 61 72 65 20 37 20 73 75 62 72  there are 7 subr
171e0 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  outines:.**.**  
171f0 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20    outA:    Move 
17200 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
17210 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74  e selectA corout
17220 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ine into the out
17230 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  put.**          
17240 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75     of the compou
17250 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  nd query..**.** 
17260 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65     outB:    Move
17270 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   the output of t
17280 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75  he selectB corou
17290 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75  tine into the ou
172a0 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  tput.**         
172b0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f      of the compo
172c0 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c  und query.  (Onl
172d0 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  y generated for 
172e0 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20  UNION and.**    
172f0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
17300 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20  LL.  EXCEPT and 
17310 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76 65 72  INSERTSECT never
17320 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20 74 68   output a row th
17330 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
17340 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69    appears only i
17350 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41  n B.).**.**    A
17360 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ltB:    Called w
17370 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17380 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17390 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a  utines and A<B..
173a0 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20  **.**    AeqB:  
173b0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
173c0 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
173d0 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
173e0 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a   and A==B..**.**
173f0 20 20 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c      AgtB:    Cal
17400 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
17410 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
17420 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
17430 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  A>B..**.**    Eo
17440 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fA:    Called wh
17450 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
17460 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
17470 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42  A..**.**    EofB
17480 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
17490 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
174a0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e  ed from selectB.
174b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  .**.** The imple
174c0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
174d0 20 6c 61 74 74 65 72 20 66 69 76 65 20 73 75 62   latter five sub
174e0 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20  routines depend 
174f0 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70  on which .** <op
17500 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a  erator> is used:
17510 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  .**.**.**       
17520 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
17530 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20          UNION   
17540 20 20 20 20 20 20 20 20 20 45 58 43 45 50 54 20           EXCEPT 
17550 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 53 45           INTERSE
17560 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d  CT.**          -
17570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
17580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
17590 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
175a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
175b0 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20  --.**   AltB:   
175c0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
175d0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
175e0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
175f0 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a         nextA.**.
17600 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74  **   AeqB:   out
17610 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
17620 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 20   nextA          
17630 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
17640 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a   outA, nextA.**.
17650 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74  **   AgtB:   out
17660 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
17670 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
17680 20 20 20 6e 65 78 74 42 20 20 20 20 20 20 20 20     nextB        
17690 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20      nextB.**.** 
176a0 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20    EofA:   outB, 
176b0 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
176c0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
176d0 68 61 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  halt            
176e0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f   halt.**.**   Eo
176f0 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  fB:   outA, next
17700 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17710 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17720 65 78 74 41 20 20 20 20 20 20 20 20 20 68 61 6c  extA         hal
17730 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41  t.**.** In the A
17740 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41  ltB, AeqB, and A
17750 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c  gtB subroutines,
17760 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c   an EOF on A fol
17770 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20  lowing nextA.** 
17780 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69  causes an immedi
17790 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41  ate jump to EofA
177a0 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42   and an EOF on B
177b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42   following nextB
177c0 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d   causes.** an im
177d0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
177e0 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f  EofB.  Within Eo
177f0 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64  fA and EofB, and
17800 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72   EOF on entry or
17810 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  .** following ne
17820 78 74 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d  xtX causes a jum
17830 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
17840 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65  the select proce
17850 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70  ssing..**.** Dup
17860 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69  licate removal i
17870 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43  n the UNION, EXC
17880 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17890 43 54 20 63 61 73 65 73 20 69 73 20 68 61 6e 64  CT cases is hand
178a0 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  led.** within th
178b0 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
178c0 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50 72 65  ine.  The regPre
178d0 76 20 72 65 67 69 73 74 65 72 20 73 65 74 20 68  v register set h
178e0 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  olds the previou
178f0 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61  sly.** output va
17900 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73  lue.  A comparis
17910 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e  on is made again
17920 73 74 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e  st this value an
17930 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  d the output.** 
17940 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  is skipped if th
17950 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77  e next results w
17960 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65  ould be the same
17970 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
17980 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ..**.** The impl
17990 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20  ementation plan 
179a0 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  is to implement 
179b0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
179c0 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20  es and seven.** 
179d0 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73  subroutines firs
179e0 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68 65 20  t, then put the 
179f0 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74  control logic at
17a00 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69   the bottom.  Li
17a10 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
17a20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69          goto Ini
17a30 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f  t.**     coA: co
17a40 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
17a50 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20   query (A).**   
17a60 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65    coB: coroutine
17a70 20 66 6f 72 20 72 69 67 68 74 20 71 75 65 72 79   for right query
17a80 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a   (B).**    outA:
17a90 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17aa0 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  of A.**    outB:
17ab0 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20   output one row 
17ac0 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20  of B (UNION and 
17ad0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a  UNION ALL only).
17ae0 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a  **    EofA: ....
17af0 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a  **    EofB: ....
17b00 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a  **    AltB: ....
17b10 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a  **    AeqB: ....
17b20 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a  **    AgtB: ....
17b30 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74  **    Init: init
17b40 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65  ialize coroutine
17b50 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20   registers.**   
17b60 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41         yield coA
17b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
17b80 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41  eof(A) goto EofA
17b90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17ba0 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20  ld coB.**       
17bb0 20 20 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74     if eof(B) got
17bc0 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70  o EofB.**    Cmp
17bd0 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a  r: Compare A, B.
17be0 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70  **          Jump
17bf0 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74   AltB, AeqB, Agt
17c00 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e  B.**     End: ..
17c10 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20  ..**.** We call 
17c20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42  AltB, AeqB, AgtB
17c30 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42  , EofA, and EofB
17c40 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62   "subroutines" b
17c50 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  ut they are not.
17c60 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c  ** actually call
17c70 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61  ed using Gosub a
17c80 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52  nd they do not R
17c90 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64  eturn.  EofA and
17ca0 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e   EofB loop.** un
17cb0 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20  til all data is 
17cc0 65 78 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a  exhausted then j
17cd0 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22  ump to the "end"
17ce0 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65   labe.  AltB, Ae
17cf0 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20  qB,.** and AgtB 
17d00 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c  jump to either L
17d10 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45  2 or to one of E
17d20 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a  ofA or EofB..*/.
17d30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17d40 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
17d50 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ECT.static int m
17d60 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17d70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
17d80 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
17d90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
17da0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
17db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17dc0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
17dd0 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
17de0 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
17df0 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
17e00 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
17e10 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
17e20 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
17e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17e40 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
17e50 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
17e60 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
17e70 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
17e80 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
17e90 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17eb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17ec0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
17ed0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 41  SelectDest destA
17ee0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17ef0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17f00 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ne A */.  Select
17f10 44 65 73 74 20 64 65 73 74 42 3b 20 20 20 20 20  Dest destB;     
17f20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
17f30 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a  or coroutine B *
17f40 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 41  /.  int regAddrA
17f50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
17f60 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
17f70 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  r select-A corou
17f80 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
17f90 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
17fa0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17fb0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
17fc0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17fd0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
17fe0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17ff0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
18000 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18010 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
18020 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18030 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
18040 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
18050 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
18060 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18070 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
18080 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18090 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
180a0 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
180b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
180c0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
180d0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
180e0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
180f0 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
18100 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
18110 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18120 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
18130 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
18140 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
18150 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
18160 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
18170 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
18180 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
18190 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
181a0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
181b0 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f  .  int addrEofA_
181c0 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65  noB;     /* Alte
181d0 72 6e 61 74 65 20 61 64 64 72 45 6f 66 41 20 69  rnate addrEofA i
181e0 66 20 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  f B is uninitial
181f0 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ized */.  int ad
18200 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  drEofB;         
18210 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18220 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75  e select-B-exhau
18230 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20  sted subroutine 
18240 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74  */.  int addrAlt
18250 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18260 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42  dress of the A<B
18270 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18280 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20   int addrAeqB;  
18290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
182a0 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75  s of the A==B su
182b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
182c0 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20 20  t addrAgtB;     
182d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
182e0 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75  f the A>B subrou
182f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
18300 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20  gLimitA;        
18310 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
18320 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
18330 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
18340 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d  B;        /* Lim
18350 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  it register for 
18360 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e  select-A */.  in
18370 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
18380 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f      /* A range o
18390 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 68  f registers to h
183a0 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74  old previous out
183b0 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  put */.  int sav
183c0 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  edLimit;       /
183d0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
183e0 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20   p->iLimit */.  
183f0 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b  int savedOffset;
18400 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
18410 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73  alue of p->iOffs
18420 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  et */.  int labe
18430 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  lCmpr;        /*
18440 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73   Label for the s
18450 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67  tart of the merg
18460 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20  e algorithm */. 
18470 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20   int labelEnd;  
18480 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
18490 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
184a0 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43  he overall SELEC
184b0 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20  T stmt */.  int 
184c0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
184d0 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75    /* Jump instru
184e0 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20  ctions that get 
184f0 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20  retargetted */. 
18500 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
18510 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
18520 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f   TK_ALL, TK_UNIO
18530 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b  N, TK_EXCEPT, TK
18540 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20  _INTERSECT */.  
18550 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70  KeyInfo *pKeyDup
18560 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69   = 0; /* Compari
18570 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
18580 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72 65  for duplicate re
18590 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e  moval */.  KeyIn
185a0 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20  fo *pKeyMerge;  
185b0 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
185c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d  nformation for m
185d0 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erging rows */. 
185e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
185f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18600 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
18610 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
18620 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
18630 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
18640 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  */.  int nOrderB
18650 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
18660 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
18670 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18680 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  ause */.  int *a
18690 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20  Permute;        
186a0 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
186b0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
186c0 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  o result set col
186d0 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  umns */.#ifndef 
186e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
186f0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 3b  AIN.  int iSub1;
18700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18710 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
18720 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
18730 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20 20  t iSub2;        
18740 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
18750 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
18760 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  y */.#endif..  a
18770 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
18780 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  By!=0 );.  asser
18790 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b  t( pKeyDup==0 );
187a0 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f   /* "Managed" co
187b0 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20  de needs this.  
187c0 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f  Ticket #3382. */
187d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
187e0 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65  db;.  v = pParse
187f0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
18800 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
18810 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72 6f   /* Already thro
18820 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66 20  wn the error if 
18830 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65  VDBE alloc faile
18840 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20  d */.  labelEnd 
18850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
18860 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
18870 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
18880 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18890 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
188a0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
188b0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
188c0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
188d0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
188e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
188f0 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
18900 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
18910 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
18920 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
18930 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
18940 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
18950 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
18960 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
18970 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
18980 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
18990 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
189a0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
189b0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
189c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
189d0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
189e0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
189f0 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
18a00 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
18a10 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
18a20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
18a30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
18a40 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
18a50 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18a60 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
18a70 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18a80 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
18a90 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
18aa0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
18ab0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
18ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
18ad0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
18ae0 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  yCol>0 );.      
18af0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
18b00 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20  .iOrderByCol==i 
18b10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18b20 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f  .      if( j==nO
18b30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
18b40 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
18b50 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
18b60 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20  K_INTEGER, 0);. 
18b70 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
18b80 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18b90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18ba0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
18bb0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
18bc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
18bd0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
18be0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c    pOrderBy = sql
18bf0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
18c00 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
18c10 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
18c20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
18c30 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
18c40 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
18c50 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
18c60 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
18c70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
18c80 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
18c90 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
18ca0 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
18cb0 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
18cc0 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
18cd0 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
18ce0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
18cf0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
18d00 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
18d10 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
18d20 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
18d30 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
18d40 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
18d50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
18d60 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
18d70 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
18d80 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
18d90 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
18da0 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
18db0 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
18dc0 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
18dd0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
18de0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
18df0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
18e00 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79  of(int)*nOrderBy
18e10 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
18e20 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
18e30 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18e40 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Item;.    for(i=
18e50 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
18e60 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79  y->a; i<nOrderBy
18e70 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
18e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18e90 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
18ea0 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20  ByCol>0.        
18eb0 20 20 26 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e    && pItem->u.x.
18ec0 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
18ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
18ee0 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
18ef0 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
18f00 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
18f10 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
18f20 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
18f30 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
18f40 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
18f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
18f60 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
18f70 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
18f80 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
18f90 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
18fa0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
18fb0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
18fc0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
18fd0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
18fe0 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
18ff0 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
19000 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19010 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
19020 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
19030 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
19040 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
19050 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
19060 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
19070 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
19080 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
19090 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
190a0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
190b0 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
190c0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
190d0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
190e0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
190f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19100 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
19110 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
19120 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
19130 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
19140 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19150 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
19160 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
19170 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19180 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
19190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
191a0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
191b0 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
191c0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
191d0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
191e0 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
191f0 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
19200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19210 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
19220 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
19230 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
19240 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
19250 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
19260 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
19270 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
19280 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
19290 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
192a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
192b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
192c0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
192d0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
192e0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
192f0 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
19300 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
19310 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
19320 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
19330 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
19340 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
19350 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
19360 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
19370 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
19380 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
19390 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
193a0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
193b0 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
193c0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
193d0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
193e0 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
193f0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
19400 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
19410 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
19420 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
19430 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
19440 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
19450 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
19460 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19470 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
19480 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
19490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
194a0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
194b0 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
194c0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
194d0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
19500 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
19510 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19520 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
19530 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
19540 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
19550 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
19560 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
19570 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
19580 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
19590 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
195a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
195b0 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
195c0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
195d0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
195e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
195f0 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
19600 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
19610 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
19620 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
19630 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
19640 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
19650 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
19660 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
19670 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
19680 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
19690 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
196a0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
196b0 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
196c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
196d0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
196e0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
196f0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
19700 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
19710 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
19720 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
19730 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
19740 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
19750 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19760 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73  v) + 1;.  j1 = s
19770 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19780 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
19790 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
197a0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
197b0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
197c0 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
197d0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
197e0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
197f0 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ;.  explainSetIn
19800 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
19810 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
19820 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Id);.  sqlite3Se
19830 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
19840 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
19850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19860 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
19870 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
19880 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
19890 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
198a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
198b0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
198c0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
198d0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
198e0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
198f0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
19900 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
19910 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
19920 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
19930 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  1;.  j1 = sqlite
19940 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19950 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
19960 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64   regAddrB, 0, ad
19970 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64  drSelectB);.  Vd
19980 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
19990 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
199a0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
199b0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
199c0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
199d0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
199e0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
199f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
19a00 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49    .  explainSetI
19a10 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
19a20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
19a30 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  tId);.  sqlite3S
19a40 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
19a50 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
19a60 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
19a70 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
19a80 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
19a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19aa0 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72  Op1(v, OP_EndCor
19ab0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
19ac0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19ad0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19ae0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
19af0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
19b00 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
19b10 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
19b20 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
19b30 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
19b40 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
19b50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19b60 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
19b70 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
19b80 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
19b90 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
19ba0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19bb0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
19bc0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
19bf0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
19c00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
19c10 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
19c20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
19c30 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
19c40 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
19c50 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
19c60 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
19c70 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
19c80 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
19c90 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
19ca0 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
19cb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
19cc0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
19cd0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
19ce0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
19cf0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
19d00 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
19d10 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
19d20 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
19d30 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
19d40 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
19d50 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
19d60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65  .  }.  sqlite3Ke
19d70 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44  yInfoUnref(pKeyD
19d80 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  up);..  /* Gener
19d90 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
19da0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
19db0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
19dc0 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
19dd0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
19de0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
19df0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
19e00 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  /.  if( op==TK_E
19e10 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
19e20 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
19e30 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
19e40 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c  addrEofA = label
19e50 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  End;.  }else{  .
19e60 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
19e70 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
19e80 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
19e90 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
19ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19eb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
19ec0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
19ed0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
19ee0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19ef0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
19f00 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65  , regAddrB, labe
19f10 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20  lEnd);.         
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
19f40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
19f50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f60 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19f70 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
19f80 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b   p->nSelectRow +
19f90 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
19fa0 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tRow;.  }..  /* 
19fb0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
19fc0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
19fd0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
19fe0 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
19ff0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
1a000 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
1a010 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
1a020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
1a030 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1a040 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1a050 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66  addrEofA;.    if
1a060 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ( p->nSelectRow 
1a070 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  > pPrior->nSelec
1a080 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
1a090 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
1a0a0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c  SelectRow;.  }el
1a0b0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
1a0c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
1a0d0 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  of-B subroutine"
1a0e0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42  ));.    addrEofB
1a0f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1a100 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1a110 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1a120 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
1a130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a140 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1a150 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64  A, labelEnd); Vd
1a160 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1a170 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a180 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1a190 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
1a1a0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1a1b0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1a1c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1a1d0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1a1e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1a1f0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1a200 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1a210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a220 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1a230 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1a240 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a250 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1a260 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1a270 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1a280 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1a290 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a2a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
1a2b0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
1a2c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a2d0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1a2e0 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
1a2f0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1a300 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1a310 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
1a320 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
1a330 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1a340 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1a350 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
1a360 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1a370 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1a380 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
1a390 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1a3a0 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
1a3b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a3c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a3d0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1a3e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1a3f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1a410 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
1a420 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1a430 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1a440 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1a450 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1a460 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1a470 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1a480 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1a490 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1a4a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1a4b0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1a4c0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1a4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1a4e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a4f0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1a500 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1a510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a520 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1a530 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1a540 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1a550 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1a560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a570 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
1a580 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  pr);..  /* This 
1a590 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74  code runs once t
1a5a0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65  o initialize eve
1a5b0 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  rything..  */.  
1a5c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a5d0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71  ere(v, j1);.  sq
1a5e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a5f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1a600 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1a610 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1a620 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1a630 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a640 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1a650 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1a660 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1a670 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1a680 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1a690 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1a6a0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1a6b0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1a6c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a6d0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1a6e0 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1a6f0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1a700 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1a710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a720 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1a730 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1a740 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1a750 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1a770 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1a780 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1a790 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1a7a0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1a7b0 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1a7c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a7d0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1a7e0 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1a7f0 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1a800 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1a810 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1a820 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1a830 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1a840 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1a850 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1a860 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1a870 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1a880 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1a890 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
1a8a0 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
1a8b0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
1a8c0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
1a8d0 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
1a8e0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
1a8f0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
1a900 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
1a910 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
1a920 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1a930 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45  e, 0, pFirst->pE
1a940 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1a950 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1a960 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1a970 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1a980 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1a990 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1a9a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1a9b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1a9c0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1a9d0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1a9e0 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1a9f0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1aa00 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1aa10 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1aa20 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1aa30 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1aa40 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1aa50 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1aa60 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1aa70 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1aa80 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1aa90 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1aaa0 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1aab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1aac0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
1aad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1aae0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1aaf0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1ab00 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
1ab10 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
1ab20 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
1ab30 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1ab40 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
1ab50 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
1ab60 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1ab70 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
1ab80 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
1ab90 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
1aba0 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
1abb0 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1abc0 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1abd0 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1abe0 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1abf0 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1ac00 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1ac10 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1ac20 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1ac30 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1ac40 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1ac50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1ac60 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1ac70 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1ac80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1ac90 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1aca0 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1acb0 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1acc0 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1acd0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1ace0 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1acf0 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1ad00 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1ad10 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1ad20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1ad30 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1ad40 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1ad50 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1ad60 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1ad70 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
1ad80 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1ad90 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1ada0 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1adb0 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1adc0 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1add0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1ade0 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1adf0 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1ae00 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1ae10 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1ae20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ae30 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
1ae40 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
1ae50 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ae60 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1ae70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
1ae80 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
1ae90 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
1aea0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1aeb0 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1aec0 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
1aed0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
1aee0 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
1aef0 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
1af00 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
1af10 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1af20 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
1af30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
1af40 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
1af50 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
1af60 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1af70 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1af80 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1af90 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1afa0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1afb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1afc0 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1afd0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
1afe0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
1aff0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1b000 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
1b010 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
1b020 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
1b030 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1b040 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
1b050 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1b060 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
1b070 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1b080 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
1b090 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1b0a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b0b0 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
1b0c0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1b0d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61  Expr->pLeft, iTa
1b0e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b0f0 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1b100 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b110 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
1b120 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b130 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1b140 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1b150 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1b160 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1b170 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
1b180 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20  Select, iTable, 
1b190 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  pEList);.    }el
1b1a0 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45  se{.      substE
1b1b0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70  xprList(db, pExp
1b1c0 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  r->x.pList, iTab
1b1d0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b1e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b1f0 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20  pExpr;.}.static 
1b200 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1b210 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
1b220 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
1b230 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
1b240 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
1b250 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1b260 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
1b270 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
1b280 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1b290 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
1b2a0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1b2b0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
1b2c0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
1b2d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
1b2e0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
1b2f0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
1b300 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b310 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1b320 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b330 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b340 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1b350 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1b360 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
1b370 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
1b380 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
1b390 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1b3a0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
1b3b0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1b3c0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
1b3d0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1b3e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1b3f0 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
1b400 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
1b410 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
1b420 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
1b430 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b440 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1b450 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
1b460 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b470 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b480 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b490 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1b4a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1b4b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1b4c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
1b4d0 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75  p ) return;.  su
1b4e0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b4f0 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
1b500 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
1b510 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b520 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
1b530 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b540 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1b550 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1b560 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b570 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73    p->pHaving = s
1b580 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
1b590 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
1b5a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
1b5b0 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1b5c0 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  r(db, p->pWhere,
1b5d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b5e0 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28  ;.  substSelect(
1b5f0 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69  db, p->pPrior, i
1b600 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b610 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1b620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
1b630 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72   );  /* Even for
1b640 20 28 53 45 4c 45 43 54 20 31 29 20 77 65 20 68   (SELECT 1) we h
1b650 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74  ave: pSrc!=0 but
1b660 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a   pSrc->nSrc==0 *
1b670 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1b680 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  Src) ){.    for(
1b690 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1b6a0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1b6b0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1b6c0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1b6d0 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  ct(db, pItem->pS
1b6e0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
1b6f0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1b700 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
1b710 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b720 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b730 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b740 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
1b750 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1b760 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1b770 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1b780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1b790 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b7a0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
1b7b0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
1b7c0 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  s as a performan
1b7d0 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
1b7e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b7f0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
1b800 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
1b810 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
1b820 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a  ening occurs..**
1b830 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e  .** To understan
1b840 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66  d the concept of
1b850 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e   flattening, con
1b860 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
1b870 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a  ing.** query:.**
1b880 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
1b890 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b   FROM (SELECT x+
1b8a0 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
1b8b0 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52  HERE z<100) WHER
1b8c0 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E a>5.**.** The 
1b8d0 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69  default way of i
1b8e0 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73  mplementing this
1b8f0 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65   query is to exe
1b900 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71  cute the.** subq
1b910 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73  uery first and s
1b920 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b930 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20   in a temporary 
1b940 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72  table, then.** r
1b950 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  un the outer que
1b960 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f  ry on that tempo
1b970 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69  rary table.  Thi
1b980 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a  s requires two.*
1b990 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68  * passes over th
1b9a0 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72  e data.  Further
1b9b0 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68  more, because th
1b9c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1b9d0 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69  e.** has no indi
1b9e0 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63  ces, the WHERE c
1b9f0 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74  lause on the out
1ba00 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  er query cannot 
1ba10 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e  be.** optimized.
1ba20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ba30 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1ba40 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20  rewrite queries 
1ba50 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76  such as the abov
1ba60 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  e into.** a sing
1ba70 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20  le flat select, 
1ba80 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ba90 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20       SELECT x+y 
1baa0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1bab0 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35  RE z<100 AND a>5
1bac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  .**.** The code 
1bad0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
1bae0 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f  is simplificatio
1baf0 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  n gives the same
1bb00 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f   result.** but o
1bb10 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20  nly has to scan 
1bb20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20  the data once.  
1bb30 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69  And because indi
1bb40 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78  ces might .** ex
1bb50 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ist on the table
1bb60 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20   t1, a complete 
1bb70 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61  scan of the data
1bb80 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f   might be.** avo
1bb90 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74  ided..**.** Flat
1bba0 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  tening is only a
1bbb0 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20  ttempted if all 
1bbc0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1bbd0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1bbe0 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71     (1)  The subq
1bbf0 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74  uery and the out
1bc00 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1bc10 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61  both use aggrega
1bc20 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29  tes..**.**   (2)
1bc30 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bc40 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1bc50 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  te or the outer 
1bc60 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1bc70 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  oin..**.**   (3)
1bc80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1bc90 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20  s not the right 
1bca0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1bcb0 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20  t outer join.** 
1bcc0 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c         (Original
1bcd0 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20  ly ticket #306. 
1bce0 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79   Strengthened by
1bcf0 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a   ticket #3300).*
1bd00 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1bd10 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1bd20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1bd30 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1bd40 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1bd50 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1bd60 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1bd70 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1bd80 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1bd90 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1bda0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1bdb0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1bdc0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1bdd0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1bde0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1bdf0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1be00 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1be10 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1be20 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1be30 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1be40 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1be50 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1be60 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1be70 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1be80 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1be90 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1bea0 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1beb0 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1bec0 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1bed0 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1bee0 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1bef0 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  ose with the spe
1bf00 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1bf10 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1bf20 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1bf30 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1bf40 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1bf50 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1bf60 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1bf70 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1bf80 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1bf90 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1bfa0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1bfb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1bfc0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1bfd0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1bfe0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1bff0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1c000 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1c010 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1c020 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1c030 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1c040 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1c050 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1c060 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1c070 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1c080 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1c090 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1c0a0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1c0b0 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1c0c0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c0d0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1c0e0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1c0f0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c100 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c  .**        use L
1c110 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31  IMIT.".**.**  (1
1c120 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1c130 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
1c140 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
1c150 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63   have ORDER BY c
1c160 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  lauses..**.**  (
1c170 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65  **)  Not impleme
1c180 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20  nted.  Subsumed 
1c190 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  into restriction
1c1a0 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69   (3).  Was previ
1c1b0 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ously.**        
1c1c0 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72  a separate restr
1c1d0 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20  iction deriving 
1c1e0 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30  from ticket #350
1c1f0 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54  ..**.**  (13)  T
1c200 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1c210 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1c220 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1c230 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1c240 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1c250 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54  s not use OFFSET
1c260 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  ..**.**  (15)  T
1c270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1c280 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
1c290 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
1c2a0 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
1c2b0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1c2c0 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20  ot have a LIMIT 
1c2d0 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
1c2e0 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
1c2f0 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b  339 and ticket [
1c300 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a  02a8e81d44])..**
1c310 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f  .**  (16)  The o
1c320 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1c330 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
1c340 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64  r the subquery d
1c350 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f  oes.**        no
1c360 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20  t contain ORDER 
1c370 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1c380 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1c390 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1c3a0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1c3b0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1c3c0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1c3d0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1c3e0 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71   (17)  The sub-q
1c3f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f  uery is not a co
1c400 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f  mpound select, o
1c410 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20  r it is a UNION 
1c420 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63  ALL .**        c
1c430 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d  ompound clause m
1c440 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20  ade up entirely 
1c450 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  of non-aggregate
1c460 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a   queries, and .*
1c470 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72  *        the par
1c480 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  ent query:.**.**
1c490 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c4a0 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f  ot itself part o
1c4b0 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
1c4c0 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ect,.**         
1c4d0 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67   * is not an agg
1c4e0 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e  regate or DISTIN
1c4f0 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a  CT query, and.**
1c500 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e            * is n
1c510 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20  ot a join.**.** 
1c520 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1c530 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1c540 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1c550 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1c560 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1c570 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1c580 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1c590 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1c5a0 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1c5b0 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1c5c0 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1c5d0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1c5e0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1c5f0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1c600 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1c610 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1c620 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1c630 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1c640 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1c650 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1c660 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1c670 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1c680 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1c690 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1c6a0 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1c6b0 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1c6c0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1c6d0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1c6e0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1c6f0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1c700 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1c710 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1c720 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1c730 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1c740 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c750 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1c760 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1c770 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1c780 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1c790 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1c7a0 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1c7b0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1c7c0 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1c7d0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1c7e0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1c7f0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1c800 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1c810 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1c820 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1c830 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1c840 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1c850 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
1c860 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
1c870 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1c880 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1c890 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1c8a0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1c8b0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1c8c0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
1c8d0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1c8e0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1c8f0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
1c900 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
1c910 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
1c920 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66  .**.**  (20)  If
1c930 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1c940 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1c950 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ect, then it mus
1c960 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  t not use.**    
1c970 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20      an ORDER BY 
1c980 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20  clause.  Ticket 
1c990 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64  #3773.  We could
1c9a0 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73   relax this cons
1c9b0 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20  traint.**       
1c9c0 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79   somewhat by say
1c9d0 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72  ing that the ter
1c9e0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1c9f0 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a  BY clause must.*
1ca00 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20  *        appear 
1ca10 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65  as unmodified re
1ca20 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  sult columns in 
1ca30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1ca40 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20    But we.**     
1ca50 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70     have other op
1ca60 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d  timizations in m
1ca70 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ind to deal with
1ca80 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a   that case..**.*
1ca90 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62  *  (21)  The sub
1caa0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1cab0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1cac0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1cad0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1cae0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1caf0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1cb00 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1cb10 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1cb20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cb30 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29  CTE..**.**  (23)
1cb40 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20    The parent is 
1cb50 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
1cb60 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d  CTE, or the sub-
1cb70 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a  query is not a.*
1cb80 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1cb90 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65  d query. This re
1cba0 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1cbb0 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1cbc0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1cbd0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1cbe0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1cbf0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1cc00 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1cc10 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1cc20 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1cc30 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1cc40 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  24)  The subquer
1cc50 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1cc60 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1cc70 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1cc80 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1cc90 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1cca0 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1ccb0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1ccc0 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1ccd0 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1cce0 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1ccf0 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1cd00 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1cd10 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1cd20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1cd30 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1cd40 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1cd50 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1cd60 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1cd70 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1cd80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1cd90 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1cda0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1cdb0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1cdc0 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1cdd0 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1cde0 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1cdf0 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62  gregates and sub
1ce00 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72  queryIsAgg is tr
1ce10 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ue if the subque
1ce20 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ry uses aggregat
1ce30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
1ce40 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
1ce50 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
1ce60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1ce70 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
1ce80 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1ce90 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
1cea0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ceb0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
1cec0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
1ced0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
1cee0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
1cef0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
1cf00 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
1cf10 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
1cf20 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
1cf30 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
1cf40 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
1cf50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cf60 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1cf70 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1cf80 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1cf90 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
1cfa0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
1cfb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
1cfc0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
1cfd0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
1cfe0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
1cff0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
1d000 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c   */.  int isAgg,
1d010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d020 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
1d030 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
1d040 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
1d050 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41   int subqueryIsA
1d060 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  gg    /* True if
1d070 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
1d080 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  es aggregate fun
1d090 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63  ctions */.){.  c
1d0a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
1d0b0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
1d0c0 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
1d0d0 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ext;.  Select *p
1d0e0 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74  Parent;.  Select
1d0f0 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a   *pSub;       /*
1d100 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
1d110 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a   or "subquery" *
1d120 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1d130 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  1;      /* Point
1d140 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d  er to the rightm
1d150 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75  ost select in su
1d160 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  b-query */.  Src
1d170 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
1d180 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
1d190 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d1a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c   query */.  SrcL
1d1b0 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20  ist *pSubSrc;   
1d1c0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d1d0 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1d1e0 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ry */.  ExprList
1d1f0 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54   *pList;    /* T
1d200 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1d210 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d220 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1d230 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1d240 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1d250 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1d260 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1d270 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
1d280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1d290 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1d2a0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1d2d0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
1d2e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d2f0 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
1d300 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
1d310 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d320 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
1d330 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d340 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1d350 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
1d360 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
1d370 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
1d380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1d390 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20  Prior==0 );  /* 
1d3a0 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65  Unable to flatte
1d3b0 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69  n compound queri
1d3c0 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  es */.  if( Opti
1d3d0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
1d3e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72  (db, SQLITE_Quer
1d3f0 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65  yFlattener) ) re
1d400 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d  turn 0;.  pSrc =
1d410 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
1d420 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f  rt( pSrc && iFro
1d430 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53  m>=0 && iFrom<pS
1d440 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53  rc->nSrc );.  pS
1d450 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  ubitem = &pSrc->
1d460 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72  a[iFrom];.  iPar
1d470 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ent = pSubitem->
1d480 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20  iCursor;.  pSub 
1d490 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
1d4a0 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ect;.  assert( p
1d4b0 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Sub!=0 );.  if( 
1d4c0 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72  isAgg && subquer
1d4d0 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20  yIsAgg ) return 
1d4e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d4f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d500 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (1)  */.  if( 
1d510 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26  subqueryIsAgg &&
1d520 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1d530 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d540 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d550 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62  n (2)  */.  pSub
1d560 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1d570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1d580 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1d590 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1d5a0 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1d5b0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1d5c0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1d5d0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1d5e0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1d5f0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1d600 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1d610 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1d620 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1d630 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1d640 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1d650 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1d660 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1d670 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1d680 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1d690 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1d6a0 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1d6b0 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1d6c0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1d6d0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1d6e0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1d6f0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d710 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1d720 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1d730 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d760 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1d770 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1d780 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1d790 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1d7a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1d7b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1d7f0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1d800 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1d810 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d840 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1d850 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1d860 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1d870 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1d880 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1d890 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1d8a0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1d8b0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1d8c0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1d8d0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d8e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1d8f0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1d900 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1d910 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1d920 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1d930 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1d940 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d950 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1d960 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1d970 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1d980 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1d990 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1d9a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d9d0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1d9e0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1d9f0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1da00 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1da10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1da20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1da30 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1da40 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1da50 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1da60 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1da70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1da80 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1da90 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1daa0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1dab0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1dac0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1dad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1dae0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1daf0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1db00 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1db10 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1db20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1db30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1db40 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1db50 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1db60 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1db70 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1db80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1db90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1dba0 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1dbb0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1dbc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1dbd0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1dbe0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1dbf0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1dc00 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1dc10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1dc20 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1dc30 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1dc40 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1dc50 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1dc60 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1dc70 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1dc80 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1dc90 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1dca0 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1dcb0 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1dcc0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1dcd0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1dce0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1dcf0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1dd00 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1dd10 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1dd20 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1dd30 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1dd40 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1dd50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1dd60 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1dd70 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1dd80 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1dd90 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1dda0 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1ddb0 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1ddc0 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1ddd0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1dde0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1ddf0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1de00 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1de10 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1de20 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1de30 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1de40 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1de50 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1de60 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1de70 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1de80 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1de90 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1dea0 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1deb0 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1dec0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1ded0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1dee0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1def0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1df00 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1df10 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1df20 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1df30 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1df40 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1df50 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1df60 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1df70 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1df80 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1df90 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1dfa0 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1dfb0 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1dfc0 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1dfd0 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1dfe0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1dff0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1e000 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1e010 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1e020 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1e030 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1e040 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1e050 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1e060 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1e070 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1e080 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1e090 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1e0a0 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1e0b0 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
1e0c0 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
1e0d0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1e0e0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
1e0f0 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
1e100 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1e110 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
1e120 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
1e130 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
1e140 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
1e150 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
1e160 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
1e170 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
1e180 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
1e190 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
1e1a0 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
1e1b0 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
1e1c0 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
1e1d0 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
1e1e0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
1e1f0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
1e200 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1e210 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1e220 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e230 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  20 */.    }.    
1e240 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
1e250 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1e260 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
1e270 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
1e280 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e290 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
1e2a0 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
1e2b0 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
1e2c0 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
1e2d0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1e2e0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1e2f0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1e300 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1e310 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
1e320 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1e330 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1e340 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1e350 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
1e360 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
1e370 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
1e380 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
1e390 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1e3a0 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1e3b0 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
1e3c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
1e3d0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
1e3e0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
1e3f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31  .       || pSub1
1e400 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20  ->pSrc->nSrc<1. 
1e410 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70        || pSub->p
1e420 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53  EList->nExpr!=pS
1e430 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1e440 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  pr.      ){.    
1e450 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1e460 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1e470 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1e480 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1e490 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1e4a0 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1e4b0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1e4c0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1e4d0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1e4e0 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1e4f0 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1e500 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1e510 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1e520 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1e530 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e550 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1e560 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1e570 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1e580 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1e590 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1e5a0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1e5b0 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1e5c0 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1e5f0 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1e600 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1e610 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1e620 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e630 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1e640 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1e650 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1e660 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1e670 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1e680 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1e690 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1e6a0 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1e6b0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1e6c0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
1e6d0 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
1e6e0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1e6f0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1e700 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
1e710 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
1e720 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
1e730 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
1e740 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
1e750 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
1e760 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
1e770 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
1e780 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
1e790 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
1e7a0 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
1e7b0 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
1e7c0 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
1e7d0 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
1e7e0 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
1e7f0 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
1e800 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
1e810 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
1e820 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
1e830 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
1e840 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
1e850 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
1e860 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
1e870 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
1e880 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
1e890 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
1e8a0 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
1e8b0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1e8c0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
1e8d0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
1e8e0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
1e8f0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
1e900 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
1e910 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
1e920 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
1e930 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1e940 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
1e950 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1e960 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
1e970 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
1e980 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
1e990 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
1e9a0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
1e9b0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
1e9c0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
1e9d0 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
1e9e0 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
1e9f0 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
1ea00 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
1ea10 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
1ea20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1ea30 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
1ea40 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
1ea50 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ea60 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
1ea70 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1ea80 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
1ea90 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1eaa0 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
1eab0 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
1eac0 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
1ead0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
1eae0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1eaf0 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
1eb00 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
1eb10 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
1eb20 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
1eb30 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
1eb40 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
1eb50 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
1eb60 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
1eb70 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1eb80 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
1eb90 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
1eba0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
1ebb0 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
1ebc0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
1ebd0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
1ebe0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
1ebf0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1ec00 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
1ec10 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
1ec20 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
1ec30 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1ec40 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
1ec50 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1ec60 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
1ec70 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
1ec80 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
1ec90 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
1eca0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
1ecb0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
1ecc0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1ecd0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
1ece0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1ecf0 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
1ed00 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
1ed10 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
1ed20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1ed30 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
1ed40 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
1ed50 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1ed60 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1ed70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
1ed80 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
1ed90 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
1eda0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
1edb0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
1edc0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
1edd0 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
1ede0 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
1edf0 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
1ee00 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
1ee10 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
1ee20 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
1ee30 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1ee40 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
1ee50 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1ee60 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1ee70 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
1ee80 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
1ee90 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
1eea0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1eeb0 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
1eec0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1eed0 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
1eee0 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
1eef0 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
1ef00 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
1ef10 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1ef20 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
1ef30 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1ef40 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
1ef50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ef60 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
1ef70 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
1ef80 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
1ef90 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
1efa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1efb0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
1efc0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
1efd0 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
1efe0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
1eff0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1f000 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
1f010 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
1f020 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
1f030 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
1f040 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
1f050 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1f060 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
1f070 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
1f080 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
1f090 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
1f0a0 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
1f0b0 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
1f0c0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
1f0d0 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
1f0e0 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
1f0f0 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
1f100 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
1f110 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
1f120 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
1f130 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
1f140 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
1f150 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
1f160 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
1f170 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
1f180 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
1f190 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
1f1a0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
1f1b0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
1f1c0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
1f1d0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1f1e0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f1f0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1f200 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
1f210 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
1f220 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1f230 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
1f240 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
1f250 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
1f260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f270 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
1f280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
1f290 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
1f2a0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
1f2b0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
1f2c0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1f2d0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
1f2e0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
1f2f0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
1f300 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
1f310 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
1f320 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
1f330 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
1f340 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
1f350 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
1f360 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1f370 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
1f380 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
1f390 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
1f3a0 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
1f3b0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
1f3c0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
1f3d0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
1f3e0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1f3f0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
1f400 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1f410 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
1f420 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
1f430 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
1f440 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
1f450 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
1f460 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
1f470 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
1f480 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
1f490 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
1f4a0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
1f4b0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
1f4c0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
1f4d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
1f4e0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
1f4f0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
1f500 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
1f510 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
1f520 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
1f530 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
1f540 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
1f550 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
1f560 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
1f570 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
1f580 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
1f590 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
1f5a0 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
1f5b0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1f5c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
1f5d0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
1f5e0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
1f5f0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1f600 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
1f610 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
1f620 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
1f630 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
1f640 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
1f650 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
1f660 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
1f670 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
1f680 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
1f690 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1f6a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f6b0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
1f6c0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1f6d0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
1f6e0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
1f6f0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1f700 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
1f710 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a  pe = pSubitem->j
1f720 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c  ointype;.    }el
1f730 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1f740 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20  ( pParent!=p ); 
1f750 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73   /* 2nd and subs
1f760 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72  equent times thr
1f770 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
1f780 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50  .      pSrc = pP
1f790 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71  arent->pSrc = sq
1f7a0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1f7b0 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
1f7c0 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d  .      if( pSrc=
1f7d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
1f7e0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1f7f0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1f800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1f810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1f820 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1f830 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f   a single slot o
1f840 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1f850 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20  e of the outer. 
1f860 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66     ** query.  If
1f870 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
1f880 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
1f890 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46  element in its F
1f8a0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20  ROM clause,.    
1f8b0 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74  ** then expand t
1f8c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74  he outer query t
1f8d0 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1f8e0 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20   it to hold all 
1f8f0 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  elements.    ** 
1f900 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1f910 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
1f920 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1f930 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20     **    SELECT 
1f940 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45  * FROM tabA, (SE
1f950 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31  LECT * FROM sub1
1f960 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20  , sub2), tabB;. 
1f970 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1f980 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73   outer query has
1f990 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20   3 slots in its 
1f9a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e  FROM clause.  On
1f9b0 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20  e slot of the.  
1f9c0 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1f9d0 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f   (the middle slo
1f9e0 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68  t) is used by th
1f9f0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65  e subquery.  The
1fa00 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f   next.    ** blo
1fa10 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20  ck of code will 
1fa20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71  expand the out q
1fa30 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e  uery to 4 slots.
1fa40 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20    The middle.   
1fa50 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61   ** slot is expa
1fa60 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
1fa70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
1fa80 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ke space for the
1fa90 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  .    ** two elem
1faa0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
1fab0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1fac0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
1fad0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
1fae0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
1faf0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
1fb00 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1fb10 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
1fb20 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
1fb30 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
1fb40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1fb50 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1fb60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fb70 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
1fb80 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
1fb90 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
1fba0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1fbb0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1fbc0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
1fbd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
1fbe0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
1fbf0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1fc00 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
1fc10 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
1fc20 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e  g);.      pSrc->
1fc30 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
1fc40 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
1fc50 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72    memset(&pSubSr
1fc60 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65  c->a[i], 0, size
1fc70 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  of(pSubSrc->a[i]
1fc80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ));.    }.    pS
1fc90 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69  rc->a[iFrom].joi
1fca0 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65  ntype = jointype
1fcb0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ;.  .    /* Now 
1fcc0 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69  begin substituti
1fcd0 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75  ng subquery resu
1fce0 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
1fcf0 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72  ns for .    ** r
1fd00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1fd10 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20   iParent in the 
1fd20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
1fd30 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d   ** .    ** Exam
1fd40 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
1fd50 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c  **   SELECT a+5,
1fd60 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45   b*10 FROM (SELE
1fd70 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31  CT x*3 AS a, y+1
1fd80 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20  0 AS b FROM t1) 
1fd90 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a  WHERE a>b;.    *
1fda0 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20  *   \           
1fdb0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
1fdc0 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72  ________ subquer
1fdd0 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  y __________/   
1fde0 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20         /.    ** 
1fdf0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1fe00 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20  _________ outer 
1fe10 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1fe20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1fe30 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20  ____/.    **.   
1fe40 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65   ** We look at e
1fe50 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
1fe60 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1fe70 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  ry and every pla
1fe80 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a  ce we see.    **
1fe90 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75   "a" we substitu
1fea0 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65  te "x*3" and eve
1feb0 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20  ry place we see 
1fec0 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "b" we substitut
1fed0 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f  e "y+10"..    */
1fee0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61  .    pList = pPa
1fef0 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  rent->pEList;.  
1ff00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1ff10 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1ff20 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1ff30 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20  ->a[i].zName==0 
1ff40 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1ff50 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1ff60 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69  DbStrDup(db, pLi
1ff70 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b  st->a[i].zSpan);
1ff80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ff90 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
1ffa0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1ffb0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  [i].zName = zNam
1ffc0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
1ffd0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1ffe0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
1fff0 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c  pEList, iParent,
20000 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
20010 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b      if( isAgg ){
20020 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
20030 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
20040 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72  ->pGroupBy, iPar
20050 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20060 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
20070 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
20080 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
20090 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
200a0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
200b0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
200c0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
200d0 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74  y ){.      /* At
200e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79   this point, any
200f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72   non-zero iOrder
20100 42 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64  ByCol values ind
20110 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
20120 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
20130 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
20140 6f 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20  on is identical 
20150 74 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43  to the iOrderByC
20160 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65  ol'th.      ** e
20170 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
20180 65 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61  ed by SELECT sta
20190 74 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e  tement pSub. Sin
201a0 63 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a  ce these values.
201b0 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20        ** do not 
201c0 6e 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72  necessarily corr
201d0 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e  espond to column
201e0 73 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  s in SELECT stat
201f0 65 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20  ement pParent,. 
20200 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65       ** zero the
20210 6d 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65  m before transfe
20220 72 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ring the ORDER B
20230 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20  Y clause..      
20240 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20  **.      ** Not 
20250 64 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63  doing this may c
20260 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66  ause an error if
20270 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   a subsequent ca
20280 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
20290 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74   ** function att
202a0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
202b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d   a compound sub-
202c0 71 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65  query into pPare
202d0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  nt.      ** (the
202e0 20 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63   only way this c
202f0 61 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20  an happen is if 
20300 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
20310 2d 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20  -query is.      
20320 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72  ** currently par
20330 74 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29  t of pSub->pSrc)
20340 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31  . See ticket [d1
20350 31 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20  1a6e908f].  */. 
20360 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
20370 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
20380 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
20390 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
203a0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
203b0 7b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  {.        pOrder
203c0 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
203d0 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
203e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
203f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  rt( pParent->pOr
20400 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
20410 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
20420 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 20  pPrior==0 );.   
20430 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
20440 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
20450 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
20460 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
20470 65 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74  else if( pParent
20480 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
20490 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
204a0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
204b0 4f 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74  OrderBy, iParent
204c0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
204d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
204e0 53 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20  Sub->pWhere ){. 
204f0 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71       pWhere = sq
20500 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
20510 20 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30   pSub->pWhere, 0
20520 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20530 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
20540 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75      }.    if( su
20550 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
20560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
20570 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  rent->pHaving==0
20580 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
20590 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61  t->pHaving = pPa
205a0 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20  rent->pWhere;.  
205b0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68      pParent->pWh
205c0 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
205d0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
205e0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
205f0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
20600 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
20610 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
20620 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
20630 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
20640 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65  xprAnd(db, pPare
20650 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20  nt->pHaving, .  
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20680 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
20690 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67  b, pSub->pHaving
206a0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73  , 0));.      ass
206b0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47  ert( pParent->pG
206c0 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
206d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f     pParent->pGro
206e0 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
206f0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53  prListDup(db, pS
20700 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29  ub->pGroupBy, 0)
20710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20720 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
20730 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
20740 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
20750 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
20760 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
20770 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
20780 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
20790 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
207a0 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
207b0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
207c0 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
207d0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
207e0 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
207f0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
20800 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
20810 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
20820 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
20830 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
20840 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
20850 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
20860 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
20870 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
20880 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
20890 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
208a0 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
208b0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
208c0 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
208d0 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
208e0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
208f0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
20900 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
20910 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
20920 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
20930 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20940 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
20950 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20960 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
20970 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
20980 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
20990 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
209a0 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
209b0 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
209c0 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
209d0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
209e0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
209f0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
20a00 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69  (db, pSub1);..#i
20a10 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
20a20 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
20a30 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
20a40 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
20a50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
20a60 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
20a70 6e 67 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  ng:\n");.    sql
20a80 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
20a90 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
20aa0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
20ab0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
20ac0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
20ad0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
20ae0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
20af0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
20b00 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
20b10 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
20b20 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
20b30 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
20b40 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
20b50 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
20b60 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
20b70 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20b80 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
20b90 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
20ba0 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
20bb0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
20bc0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
20bd0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
20be0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
20bf0 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
20c00 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
20c10 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
20c20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
20c30 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
20c40 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
20c50 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
20c60 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
20c70 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
20c80 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
20c90 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
20ca0 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
20cb0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
20cc0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
20cd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20ce0 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
20cf0 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
20d00 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
20d10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
20d20 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
20d30 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
20d40 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
20d50 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
20d60 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
20d70 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
20d80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20d90 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
20da0 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
20db0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
20dc0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
20dd0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
20de0 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
20df0 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
20e00 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
20e10 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
20e20 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
20e30 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
20e40 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
20e50 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
20e60 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
20e70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
20e80 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
20e90 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
20ea0 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
20eb0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
20ec0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
20ed0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
20ee0 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
20ef0 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
20f00 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
20f10 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
20f20 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
20f30 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
20f40 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
20f50 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
20f60 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
20f70 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
20f80 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
20f90 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
20fa0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
20fb0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
20fc0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
20fd0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
20fe0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
20ff0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
21000 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
21010 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
21020 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
21030 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
21040 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
21050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21060 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
21070 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
21080 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
21090 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
210a0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
210b0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
210c0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
210d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
210e0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
210f0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
21100 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
21110 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
21120 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
21130 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
21140 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
21150 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
21160 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
21170 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
21180 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
21190 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
211a0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
211b0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
211c0 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
211d0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
211e0 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
211f0 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
21200 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
21210 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
21220 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
21230 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
21240 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
21250 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21260 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
21270 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
21280 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
21290 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
212a0 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
212b0 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
212c0 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
212d0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
212e0 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
212f0 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
21300 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
21310 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
21320 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
21330 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
21340 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
21350 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
21360 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
21370 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
21380 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
21390 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
213a0 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
213b0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
213c0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
213d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
213e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
213f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21400 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
21410 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
21420 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
21430 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
21440 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
21450 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
21460 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
21470 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
21480 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
21490 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
214a0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
214b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
214c0 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
214d0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
214e0 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
214f0 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
21500 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
21510 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
21520 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
21530 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
21540 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
21550 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
21560 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
21570 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
21580 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
21590 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
215a0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
215b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
215c0 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
215d0 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
215e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
215f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
21600 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
21610 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
21620 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21630 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
21640 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
21650 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20  rom->zIndex ){. 
21660 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
21670 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
21680 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d    char *zIndex =
21690 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a   pFrom->zIndex;.
216a0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
216b0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
216c0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
216d0 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
216e0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
216f0 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29  ->zName, zIndex)
21700 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
21710 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
21720 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
21730 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21740 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21750 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
21760 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30  : %s", zIndex, 0
21770 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
21780 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
21790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
217a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
217b0 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
217c0 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d  ndex = pIdx;.  }
217d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
217e0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74  _OK;.}./*.** Det
217f0 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ect compound SEL
21800 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
21810 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52  hat use an ORDER
21820 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20   BY clause with 
21830 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  .** an alternati
21840 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ve collating seq
21850 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  uence..**.**    
21860 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21870 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
21880 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44   ... FROM t2 ORD
21890 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45  ER BY .. COLLATE
218a0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65   ....**.** These
218b0 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61   are rewritten a
218c0 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a  s a subquery:.**
218d0 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .**    SELECT * 
218e0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
218f0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
21900 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21910 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52  t2).**     ORDER
21920 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20   BY ... COLLATE 
21930 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  ....**.** This t
21940 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
21950 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
21960 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65  se the multiSele
21970 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74  ctOrderBy() rout
21980 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61  ine.** above tha
21990 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  t generates the 
219a0 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f  code for a compo
219b0 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20  und SELECT with 
219c0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
219d0 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72  se.** uses a mer
219e0 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61  ge algorithm tha
219f0 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73  t requires the s
21a00 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
21a10 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a  quence on the.**
21a20 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
21a30 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  as on the ORDER 
21a40 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20  BY clause.  See 
21a50 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f  ticket.** http:/
21a60 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
21a70 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34  src/info/6709574
21a80 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74  d2a.**.** This t
21a90 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
21aa0 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72   only needed for
21ab0 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45   EXCEPT, INTERSE
21ac0 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a  CT, and UNION..*
21ad0 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  * The UNION ALL 
21ae0 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66  operator works f
21af0 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65  ine with multiSe
21b00 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76  lectOrderBy() ev
21b10 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65  en when.** there
21b20 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72   are COLLATE ter
21b30 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
21b40 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  BY..*/.static in
21b50 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  t convertCompoun
21b60 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
21b70 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  y(Walker *pWalke
21b80 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
21b90 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74   int i;.  Select
21ba0 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
21bb0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20   *pX;.  sqlite3 
21bc0 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78  *db;.  struct Ex
21bd0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
21be0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53    SrcList *pNewS
21bf0 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rc;.  Parse *pPa
21c00 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d  rse;.  Token dum
21c10 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50  my;..  if( p->pP
21c20 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  rior==0 ) return
21c30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
21c40 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
21c50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
21c60 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72  _Continue;.  for
21c70 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58  (pX=p; pX && (pX
21c80 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
21c90 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pX->op==TK_SELEC
21ca0 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  T); pX=pX->pPrio
21cb0 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30  r){}.  if( pX==0
21cc0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
21cd0 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d  ntinue;.  a = p-
21ce0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20  >pOrderBy->a;.  
21cf0 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42  for(i=p->pOrderB
21d00 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30  y->nExpr-1; i>=0
21d10 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20  ; i--){.    if( 
21d20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67  a[i].pExpr->flag
21d30 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
21d40 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
21d50 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57  ( i<0 ) return W
21d60 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20  RC_Continue;..  
21d70 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
21d80 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20  his point, that 
21d90 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66  means the transf
21da0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75  ormation is requ
21db0 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72  ired. */..  pPar
21dc0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
21dd0 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
21de0 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
21df0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
21e00 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
21e10 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
21e20 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
21e30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d  n WRC_Abort;.  m
21e40 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c  emset(&dummy, 0,
21e50 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b   sizeof(dummy));
21e60 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c  .  pNewSrc = sql
21e70 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
21e80 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
21e90 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e  ,0,0,0,&dummy,pN
21ea0 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70  ew,0,0);.  if( p
21eb0 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75  NewSrc==0 ) retu
21ec0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
21ed0 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d  *pNew = *p;.  p-
21ee0 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b  >pSrc = pNewSrc;
21ef0 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73  .  p->pEList = s
21f00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
21f10 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
21f20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
21f30 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70  TK_ALL, 0));.  p
21f40 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
21f50 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
21f60 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
21f70 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
21f80 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
21f90 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
21fa0 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
21fb0 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
21fc0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
21fd0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
21fe0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  nd;.  assert( pN
21ff0 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b  ew->pPrior!=0 );
22000 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d  .  pNew->pPrior-
22010 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
22020 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
22030 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
22040 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
22050 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
22060 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22070 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
22080 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28  Argument pWith (
22090 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c  which may be NUL
220a0 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c  L) points to a l
220b0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65  inked list of ne
220c0 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f  sted .** WITH co
220d0 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e  ntexts, from inn
220e0 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e  er to outermost.
220f0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64   If the table id
22100 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  entified by .** 
22110 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
22120 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61  ent pItem is rea
22130 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62  lly a common-tab
22140 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43  le-expression (C
22150 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74  TE) .** then ret
22160 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22170 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74   the CTE definit
22180 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62  ion for that tab
22190 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  le. Otherwise.**
221a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
221b0 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c  .** If a non-NUL
221c0 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72  L value is retur
221d0 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74  ned, set *ppCont
221e0 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ext to point to 
221f0 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65  the With.** obje
22200 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75  ct that the retu
22210 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73  rned CTE belongs
22220 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73   to..*/.static s
22230 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63  truct Cte *searc
22240 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70  hWith(.  With *p
22250 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
22260 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
22270 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49  ent outermost WI
22280 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  TH clause */.  s
22290 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
222a0 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f  em *pItem,     /
222b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
222c0 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65  ement to resolve
222d0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43   */.  With **ppC
222e0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20  ontext          
222f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49        /* OUT: WI
22300 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e  TH clause return
22310 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74   value belongs t
22320 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  o */.){.  const 
22330 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
22340 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
22350 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65  ase==0 && (zName
22360 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29   = pItem->zName)
22370 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  !=0 ){.    With 
22380 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57  *p;.    for(p=pW
22390 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75  ith; p; p=p->pOu
223a0 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ter){.      int 
223b0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
223c0 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b  ; i<p->nCte; i++
223d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
223e0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
223f0 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  ame, p->a[i].zNa
22400 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
22410 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d      *ppContext =
22420 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   p;.          re
22430 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  turn &p->a[i];. 
22440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22460 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn 0;.}../* The
22470 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
22480 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63  maintains a stac
22490 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48  k of active WITH
224a0 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68   clauses.** with
224b0 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20   the inner-most 
224c0 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e  WITH clause bein
224d0 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  g at the top of 
224e0 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
224f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
22500 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c  shes the WITH cl
22510 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74  ause passed as t
22520 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
22530 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74  nt.** onto the t
22540 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
22550 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72   If argument bFr
22560 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ee is true, then
22570 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c   this.** WITH cl
22580 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  ause will never 
22590 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  be popped from t
225a0 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69  he stack. In thi
225b0 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f  s case it.** sho
225c0 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f  uld be freed alo
225d0 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73  ng with the Pars
225e0 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68  e object. In oth
225f0 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a  er cases, when.*
22600 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20  * bFree==0, the 
22610 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c  With object will
22620 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
22630 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20  with the SELECT 
22640 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69  .** statement wi
22650 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61  th which it is a
22660 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f  ssociated..*/.vo
22670 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  id sqlite3WithPu
22680 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
22690 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75  , With *pWith, u
226a0 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65  8 bFree){.  asse
226b0 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20  rt( bFree==0 || 
226c0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
226d0 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
226e0 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f  ){.    pWith->pO
226f0 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70  uter = pParse->p
22700 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
22710 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
22720 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72  .    pParse->bFr
22730 65 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a  eeWith = bFree;.
22740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
22750 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
22760 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46  s if argument pF
22770 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20  rom refers to a 
22780 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20  CTE declared by 
22790 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73  .** a WITH claus
227a0 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63  e on the stack c
227b0 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69  urrently maintai
227c0 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ned by the parse
227d0 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75  r. And,.** if cu
227e0 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
227f0 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73  ng a CTE express
22800 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20  ion, if it is a 
22810 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66  recursive.** ref
22820 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75  erence to the cu
22830 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rrent CTE..**.**
22840 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20   If pFrom falls 
22850 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74  into either of t
22860 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65  he two categorie
22870 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e  s above, pFrom->
22880 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  pTab.** and othe
22890 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  r fields are pop
228a0 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  ulated according
228b0 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73  ly. The caller s
228c0 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28  hould check.** (
228d0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20  pFrom->pTab!=0) 
228e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
228f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75  ther or not a su
22900 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a  ccessful match.*
22910 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  * was found..**.
22920 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
22930 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  t a match is fou
22940 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  nd, SQLITE_OK is
22950 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
22960 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
22970 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
22980 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f  s occur, an erro
22990 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
229a0 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  red in the.** pa
229b0 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72  rser and some er
229c0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
229d0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  han SQLITE_OK re
229e0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
229f0 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64  c int withExpand
22a00 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c  (.  Walker *pWal
22a10 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53  ker, .  struct S
22a20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
22a30 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  om.){.  Parse *p
22a40 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
22a50 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
22a60 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22a70 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74  >db;.  struct Ct
22a80 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20  e *pCte;        
22a90 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
22aa0 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69  d CTE (or NULL i
22ab0 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20  f no match) */. 
22ac0 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20   With *pWith;   
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20   /* WITH clause 
22af0 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67  that pCte belong
22b00 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
22b10 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
22b20 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73  0 );..  pCte = s
22b30 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65  earchWith(pParse
22b40 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20  ->pWith, pFrom, 
22b50 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70  &pWith);.  if( p
22b60 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  Cte ){.    Table
22b70 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72   *pTab;.    Expr
22b80 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
22b90 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
22ba0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66      Select *pLef
22bb0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22bc0 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53    /* Left-most S
22bd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
22be0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52  */.    int bMayR
22bf0 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
22c00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22c10 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20  compound joined 
22c20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a  by UNION [ALL] *
22c30 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76  /.    With *pSav
22c40 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  edWith;         
22c50 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
22c60 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
22c70 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pWith */..    /*
22c80 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69   If pCte->zErr i
22c90 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
22ca0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
22cb0 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
22cc0 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
22cd0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
22ce0 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
22cf0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
22d00 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
22d10 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
22d20 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c  Cte->zErr is NUL
22d30 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  L, then this is 
22d40 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  not a recursive 
22d50 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a  reference..    *
22d60 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
22d70 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20  proceed.  */.   
22d80 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20   if( pCte->zErr 
22d90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22da0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
22db0 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74   pCte->zErr, pCt
22dc0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
22dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22de0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
22df0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
22e00 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pTab==0 );.    p
22e10 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
22e20 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
22e30 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
22e40 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
22e50 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
22e60 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22e70 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
22e80 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
22e90 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
22ea0 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
22eb0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
22ec0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
22ed0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
22ee0 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
22ef0 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
22f00 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
22f10 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
22f20 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
22f30 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  ral;.    pFrom->
22f40 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
22f50 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
22f60 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Cte->pSelect, 0)
22f70 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
22f80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
22f90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22fa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
22fb0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
22fc0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
22fd0 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
22fe0 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
22ff0 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
23000 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
23010 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
23020 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
23030 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
23040 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
23050 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
23060 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
23070 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
23080 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
23090 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
230a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
230b0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
230c0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
230d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
230e0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
230f0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
23100 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
23110 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
23120 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
23130 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
23140 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
23150 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
23160 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
23170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
23180 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
23190 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
231a0 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d 20  ->isRecursive = 
231b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
231c0 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  b->nRef++;.     
231d0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
231e0 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
231f0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
23200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23210 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
23220 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
23230 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
23240 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
23250 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  ->nRef>2 ){.    
23260 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23270 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
23280 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
23290 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
232a0 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
232b0 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
232c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
232d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
232e0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
232f0 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d  ert( pTab->nRef=
23300 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65  =1 || ((pSel->se
23310 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
23320 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 52  ive) && pTab->nR
23330 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
23340 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69 72  Cte->zErr = "cir
23350 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
23360 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
23370 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
23380 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
23390 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
233a0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
233b0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
233c0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f 20  bMayRecursive ? 
233d0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20 70  pSel->pPrior : p
233e0 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Sel);..    for(p
233f0 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74  Left=pSel; pLeft
23400 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d  ->pPrior; pLeft=
23410 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a  pLeft->pPrior);.
23420 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65      pEList = pLe
23430 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ft->pEList;.    
23440 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20  if( pCte->pCols 
23450 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c  ){.      if( pEL
23460 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65  ist->nExpr!=pCte
23470 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29  ->pCols->nExpr )
23480 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23490 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
234a0 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
234b0 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64  %d values for %d
234c0 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20   columns",.     
234d0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61         pCte->zNa
234e0 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  me, pEList->nExp
234f0 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r, pCte->pCols->
23500 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b  nExpr.        );
23510 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
23520 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
23530 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ith;.        ret
23540 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
23550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23560 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70  pEList = pCte->p
23570 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Cols;.    }..   
23580 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
23590 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
235a0 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
235b0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
235c0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
235d0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
235e0 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
235f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
23600 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
23610 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22    pCte->zErr = "
23620 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
23630 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
23640 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
23650 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
23660 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
23670 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
23680 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
23690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
236a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
236b0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
236c0 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
236d0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Err = 0;.    pPa
236e0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
236f0 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20  vedWith;.  }..  
23700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23710 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
23720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23730 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CTE./*.** If the
23740 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61   SELECT passed a
23750 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
23760 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73  ument has an ass
23770 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a  ociated WITH .**
23780 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20   clause, pop it 
23790 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73  from the stack s
237a0 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66  tored as part of
237b0 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
237c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
237d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61  nction is used a
237e0 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c  s the xSelectCal
237f0 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63  lback2() callbac
23800 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53  k by.** sqlite3S
23810 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68  electExpand() wh
23820 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c  en walking a SEL
23830 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f  ECT tree to reso
23840 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  lve table.** nam
23850 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f  es and other FRO
23860 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
23870 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
23880 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  id selectPopWith
23890 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
238a0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
238b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
238c0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
238d0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d  .  With *pWith =
238e0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
238f0 29 2d 3e 70 57 69 74 68 3b 0a 20 20 69 66 28 20  )->pWith;.  if( 
23900 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
23910 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
23920 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
23930 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
23940 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
23950 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  r;.  }.}.#else.#
23960 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70  define selectPop
23970 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  With 0.#endif../
23980 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23990 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
239a0 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
239b0 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
239c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
239d0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
239e0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
239f0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
23a00 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
23a10 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
23a20 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
23a30 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
23a40 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
23a50 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
23a60 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
23a70 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
23a80 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
23a90 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
23aa0 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
23ab0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
23ac0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
23ad0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
23ae0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
23af0 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
23b00 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
23b10 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
23b20 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
23b30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
23b40 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
23b50 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
23b60 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
23b70 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
23b80 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
23b90 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
23ba0 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
23bb0 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
23bc0 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
23bd0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
23be0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
23bf0 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
23c00 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
23c10 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
23c20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
23c30 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
23c40 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
23c50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23c60 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
23c70 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
23c80 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
23c90 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
23ca0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
23cb0 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
23cc0 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
23cd0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
23ce0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
23cf0 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
23d00 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
23d10 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
23d20 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
23d30 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
23d40 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
23d50 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
23d60 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
23d70 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
23d80 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
23d90 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
23da0 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
23db0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
23dc0 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
23dd0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
23de0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
23df0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
23e00 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
23e10 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
23e20 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
23e30 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
23e40 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
23e50 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
23e60 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
23e70 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
23e80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
23e90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
23ea0 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
23eb0 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
23ec0 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
23ed0 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c  Flags;..  p->sel
23ee0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
23ef0 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
23f00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
23f10 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
23f20 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
23f30 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
23f40 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20  0) || (selFlags 
23f50 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
23f60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
23f70 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
23f80 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
23f90 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
23fa0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
23fb0 20 70 57 61 6c 6b 65 72 2d 3e 78 53 65 6c 65 63   pWalker->xSelec
23fc0 74 43 61 6c 6c 62 61 63 6b 32 3d 3d 73 65 6c 65  tCallback2==sele
23fd0 63 74 50 6f 70 57 69 74 68 20 29 7b 0a 20 20 20  ctPopWith ){.   
23fe0 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
23ff0 28 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67  (pParse, findRig
24000 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
24010 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
24020 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
24030 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
24040 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
24050 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
24060 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
24070 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
24080 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
24090 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
240a0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
240b0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
240c0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
240d0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
240e0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
240f0 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
24100 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
24110 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
24120 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
24130 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
24140 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
24150 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
24160 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
24170 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
24180 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
24190 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
241a0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
241b0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
241c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
241d0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
241e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
241f0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
24200 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  ->isRecursive==0
24210 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20   || pFrom->pTab 
24220 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
24230 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  ->isRecursive ) 
24240 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24250 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
24260 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
24270 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
24280 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
24290 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
242a0 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
242b0 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
242c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
242d0 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  ( i==0 );.#ifnde
242e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
242f0 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f  E.      selectPo
24300 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70  pWith(pWalker, p
24310 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
24320 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
24330 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
24340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
24350 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
24360 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
24370 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
24380 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
24390 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
243a0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
243b0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
243c0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
243d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
243e0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
243f0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
24400 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
24410 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
24420 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
24430 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
24440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
24450 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
24460 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
24470 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
24480 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
24490 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
244a0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
244b0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
244c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
244d0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
244e0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
244f0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
24500 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
24510 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
24520 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
24530 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
24540 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
24550 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54  q_%p", (void*)pT
24560 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
24570 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
24580 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
24590 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
245a0 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
245b0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
245c0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
245d0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
245e0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
245f0 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
24600 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
24610 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
24620 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
24630 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
24640 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  76) );.      pTa
24650 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
24660 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
24670 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
24680 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
24690 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
246a0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
246b0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
246c0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
246d0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
246e0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
246f0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
24700 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
24710 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
24720 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
24730 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
24740 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
24750 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
24760 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
24770 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24780 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
24790 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
247a0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
247b0 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
247c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
247d0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
247e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
247f0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
24800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
24810 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
24820 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
24830 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
24840 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
24850 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
24860 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
24870 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
24880 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
24890 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
248a0 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
248b0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
248c0 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
248d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
248e0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
248f0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
24900 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
24910 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
24920 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
24930 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
24940 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
24950 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
24960 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
24970 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
24980 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
24990 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72  electSetName(pFr
249a0 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61  om->pSelect, pTa
249b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
249c0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
249d0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
249e0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
249f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24a00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
24a10 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
24a20 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
24a30 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
24a40 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
24a50 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
24a60 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
24a70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
24a80 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
24a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
24aa0 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
24ab0 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
24ac0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
24ad0 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
24ae0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
24af0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
24b00 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
24b10 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
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 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
24b40 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
24b50 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
24b60 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
24b70 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
24b80 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
24b90 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
24ba0 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
24bb0 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
24bc0 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
24bd0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
24be0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
24bf0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
24c00 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
24c10 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
24c20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
24c30 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
24c40 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
24c50 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
24c60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
24c70 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
24c80 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
24c90 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
24ca0 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
24cb0 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
24cc0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
24cd0 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
24ce0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
24cf0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
24d00 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
24d10 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
24d20 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
24d30 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
24d40 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
24d50 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
24d60 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
24d70 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
24d80 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
24d90 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
24da0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
24db0 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
24dc0 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
24dd0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
24de0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
24df0 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
24e00 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
24e10 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
24e20 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
24e30 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
24e40 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
24e50 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  L ) break;.  }. 
24e60 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
24e70 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
24e80 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
24e90 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
24ea0 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
24eb0 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
24ec0 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
24ed0 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
24ee0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
24ef0 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
24f00 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
24f10 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
24f20 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
24f30 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
24f40 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
24f50 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
24f60 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
24f70 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
24f80 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
24f90 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
24fa0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
24fb0 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
24fc0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
24fd0 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
24fe0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
24ff0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
25000 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
25010 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
25020 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f  .    /* When pro
25030 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61  cessing FROM-cla
25040 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  use subqueries, 
25050 69 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  it is always the
25060 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61   case.    ** tha
25070 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61  t full_column_na
25080 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72  mes=OFF and shor
25090 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f  t_column_names=O
250a0 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73  N.  The.    ** s
250b0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
250c0 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e  fSelect() routin
250d0 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a  e makes it so. *
250e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
250f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
25100 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20  NestedFrom)==0. 
25110 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
25120 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
25130 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26  lColNames)==0 &&
25140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
25150 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25160 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
25170 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ) );..    for(k=
25180 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
25190 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
251a0 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
251b0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
251c0 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
251d0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
251e0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
251f0 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
25200 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
25210 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
25220 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
25230 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
25240 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
25250 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
25260 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
25270 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
25280 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
25290 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
252a0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
252b0 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
252c0 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
252d0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
252e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
252f0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
25300 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
25310 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
25320 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
25330 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
25340 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
25350 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
25360 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
25370 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
25380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25390 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
253a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
253b0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
253c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
253d0 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
253e0 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
253f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
25400 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
25410 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
25420 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
25430 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
25440 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
25450 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
25460 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
25470 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
25480 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
25490 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
254a0 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
254b0 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
254c0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
254d0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
254e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
254f0 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
25500 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
25510 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
25520 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
25530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25540 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
25550 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
25560 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
25570 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
25580 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
25590 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
255a0 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
255b0 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
255c0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
255d0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
255e0 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
255f0 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
25600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
25610 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
25620 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
25630 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
25640 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
25650 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
25660 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
25670 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25680 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
25690 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
256a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
256b0 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
256c0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
256d0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
256e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
256f0 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
25700 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
25710 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
25720 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
25730 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
25740 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25750 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
25760 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
25770 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
25780 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
25790 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
257a0 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
257b0 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
257c0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
257d0 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
257e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
257f0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
25800 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
25810 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
25820 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
25830 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
25840 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
25850 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
25860 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
25870 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
25880 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
25890 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
258a0 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
258b0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
258c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
258d0 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
258e0 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
258f0 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
25900 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
25910 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
25920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25930 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
25940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
25950 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
25960 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
25970 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
25980 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
25990 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
259b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
259c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
259d0 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
259e0 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
259f0 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
25a00 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
25a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
25a20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
25a30 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
25a40 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
25a50 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
25a60 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
25a70 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
25a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
25a90 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
25aa0 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
25ab0 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
25ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
25ad0 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
25af0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
25b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
25b10 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
25b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25b30 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
25b40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
25b50 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a     if( (pFrom->j
25b60 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
25b70 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
25b80 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
25b90 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
25ba0 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
25bb0 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
25bc0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25be0 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
25bf0 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
25c00 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
25c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25c20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
25c30 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
25c40 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
25c50 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
25c80 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
25c90 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
25ca0 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
25cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25cc0 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
25cd0 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
25ce0 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
25cf0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
25d00 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
25d10 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
25d20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
25d30 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
25d40 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
25d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
25d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
25d70 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
25d80 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
25d90 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
25da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
25db0 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
25dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
25dd0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
25de0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
25df0 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
25e00 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
25e10 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
25e20 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
25e30 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
25e40 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
25e50 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
25e60 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
25e70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
25e80 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
25e90 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
25ea0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
25eb0 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
25ec0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
25ed0 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
25ee0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
25ef0 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
25f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25f10 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
25f20 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
25f30 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
25f40 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
25f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25f60 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
25f70 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
25f80 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
25f90 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
25fa0 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
25fb0 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
25fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25fd0 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
25fe0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
25ff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26010 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
26020 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
26030 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
26040 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
26050 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
26060 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
26070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
26080 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c  Colname.z = zCol
26090 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
260a0 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73    sColname.n = s
260b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
260c0 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
260d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
260e0 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
260f0 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
26100 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
26110 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
26120 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
26130 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
26140 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26150 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
26160 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
26170 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
26180 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
26190 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
261a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
261b0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
261c0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
261d0 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
261e0 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
26200 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
26210 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
26220 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26230 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
26240 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
26250 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
26260 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
26270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
262a0 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
262b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
262c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
262d0 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
262e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
262f0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
26300 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
26310 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26320 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26330 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
26340 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
26350 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26360 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
26370 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
26380 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
26390 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
263a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
263b0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
263c0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
263d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
263e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
263f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
26400 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
26410 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
26420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26430 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
26440 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26450 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
26460 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
26470 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
26480 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
26490 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
264a0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
264b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
264c0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
264d0 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
264e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
264f0 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
26500 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
26510 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
26520 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
26530 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26540 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
26550 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
26560 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
26570 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
26580 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
26590 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
265a0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
265b0 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
265c0 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
265d0 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
265e0 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
265f0 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
26600 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
26610 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
26620 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
26630 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
26640 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
26650 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
26660 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
26670 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
26680 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
26690 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
266a0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
266b0 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
266c0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
266d0 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
266e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
266f0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
26700 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
26710 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26720 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
26730 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
26740 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
26750 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
26760 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
26770 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
26780 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
26790 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
267a0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
267b0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
267c0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
267d0 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
267e0 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
267f0 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
26800 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
26810 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
26820 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
26830 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
26840 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
26850 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
26860 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
26870 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
26880 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
26890 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
268a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
268b0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
268c0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
268d0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
268e0 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
268f0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
26900 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
26910 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
26920 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
26930 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
26940 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
26950 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
26960 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
26970 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
26980 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
26990 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
269a0 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
269b0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
269c0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
269d0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
269e0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
269f0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
26a00 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ( pParse->hasCom
26a10 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78  pound ){.    w.x
26a20 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
26a30 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
26a40 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
26a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
26a60 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
26a70 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
26a80 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
26a90 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
26aa0 20 20 69 66 28 20 28 70 53 65 6c 65 63 74 2d 3e    if( (pSelect->
26ab0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
26ac0 6c 56 61 6c 75 65 73 29 3d 3d 30 20 29 7b 0a 20  lValues)==0 ){. 
26ad0 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
26ae0 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f  back2 = selectPo
26af0 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20 73 71 6c  pWith;.  }.  sql
26b00 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
26b10 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
26b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26b30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
26b40 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
26b50 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
26b60 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
26b70 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
26b80 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
26b90 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
26ba0 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
26bb0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
26bc0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
26bd0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
26be0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
26bf0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
26c00 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
26c10 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
26c20 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
26c30 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
26c40 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
26c50 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
26c60 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
26c70 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
26c80 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
26c90 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
26ca0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
26cb0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
26cc0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
26cd0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
26ce0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
26cf0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
26d00 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
26d10 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
26d20 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
26d30 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
26d40 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
26d50 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
26d60 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
26d70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
26d80 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
26d90 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
26da0 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
26db0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
26dc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
26dd0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
26de0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
26df0 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
26e00 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
26e10 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
26e20 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
26e30 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
26e40 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
26e50 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
26e60 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
26e70 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
26e80 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
26e90 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
26ea0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
26eb0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
26ec0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
26ed0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
26ee0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
26ef0 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d  f( ALWAYS(pTab!=
26f00 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  0) && (pTab->tab
26f10 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
26f20 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
26f30 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
26f40 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
26f50 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
26f60 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
26f70 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
26f80 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
26f90 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
26fa0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
26fb0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
26fc0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
26fd0 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ior;.          s
26fe0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
26ff0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
27000 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
27010 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
27020 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
27030 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
27040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
27050 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
27060 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
27070 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
27080 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
27090 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
270a0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
270b0 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
270c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
270d0 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
270e0 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
270f0 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
27100 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
27110 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
27120 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
27130 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
27140 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
27150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
27160 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
27170 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
27180 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
27190 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
271a0 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
271b0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
271c0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
271d0 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
271e0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
271f0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
27200 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
27210 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
27220 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
27230 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
27240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27250 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
27260 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
27270 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
27280 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
27290 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
272a0 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
272b0 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
272c0 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
272d0 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
272e0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
272f0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
27300 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
27310 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
27320 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
27330 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
27340 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
27350 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
27360 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
27370 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
27380 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
27390 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
273a0 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
273b0 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
273c0 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
273d0 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
273e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
273f0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
27400 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
27410 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
27420 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
27430 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
27440 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
27450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
27460 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
27470 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
27480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27490 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
274a0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
274b0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
274c0 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
274d0 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
274e0 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
274f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
27500 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
27510 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
27520 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
27530 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27540 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
27550 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
27560 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
27570 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
27580 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
27590 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
275a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
275b0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
275c0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
275d0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
275e0 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
275f0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
27600 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
27610 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
27620 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
27630 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
27640 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
27650 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
27660 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
27670 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
27680 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
27690 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
276a0 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
276b0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
276c0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
276d0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
276e0 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
276f0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
27700 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
27710 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
27720 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
27730 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
27740 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
27750 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
27760 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
27770 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
27780 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
27790 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
277a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
277b0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
277c0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
277d0 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
277e0 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
277f0 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
27800 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
27810 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
27820 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
27830 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
27840 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
27850 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
27860 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
27870 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
27880 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
27890 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
278a0 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
278b0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
278c0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
278d0 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
278e0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
278f0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
27900 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
27910 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
27920 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
27930 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
27940 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
27950 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
27960 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
27970 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
27980 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
27990 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
279a0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
279b0 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
279c0 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
279d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
279e0 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
279f0 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
27a00 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
27a10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
27a20 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
27a30 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
27a40 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
27a50 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
27a60 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
27a70 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
27a80 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
27a90 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
27aa0 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
27ab0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
27ac0 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
27ad0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
27ae0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
27af0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
27b00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
27b10 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
27b20 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
27b30 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
27b40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27b50 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
27b60 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
27b70 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
27b80 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
27b90 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
27ba0 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
27bb0 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
27bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27bd0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
27be0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
27bf0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
27c00 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pE->x.pList, 0, 
27c10 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
27c20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
27c30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
27c40 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
27c50 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c70 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
27c80 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
27c90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27ca0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
27cb0 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
27cc0 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
27cd0 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
27ce0 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
27cf0 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
27d00 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
27d10 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
27d20 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
27d30 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
27d40 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
27d50 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
27d60 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
27d70 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
27d80 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
27d90 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
27da0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
27db0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
27dc0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
27dd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
27de0 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
27df0 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
27e00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
27e10 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
27e20 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
27e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27e40 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
27e50 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
27e60 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
27e70 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
27ea0 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
27eb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
27ec0 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
27ed0 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
27ee0 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
27ef0 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
27f00 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
27f10 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
27f20 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
27f30 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
27f40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
27f50 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
27f60 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
27f70 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
27f80 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
27f90 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
27fa0 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
27fb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
27fc0 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
27fd0 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
27fe0 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
27ff0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
28000 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
28010 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
28020 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
28030 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
28040 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
28050 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
28060 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
28070 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
28080 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
28090 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
280a0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
280b0 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
280c0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
280d0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
280e0 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
280f0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
28100 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
28110 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
28120 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
28130 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28140 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
28150 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
28160 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45  regAgg, SQLITE_E
28170 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
28180 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
28190 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
281a0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
281b0 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
281c0 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
281d0 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
281e0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
281f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28200 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
28210 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
28220 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
28230 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
28240 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
28250 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
28260 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
28270 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
28280 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
28290 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
282a0 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
282b0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
282c0 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
282d0 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
282e0 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
282f0 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
28300 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
28310 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
28320 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
28330 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
28340 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
28350 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
28360 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
28370 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
28380 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
28390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
283a0 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
283b0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
283c0 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
283d0 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
283e0 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
283f0 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
28400 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
28410 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
28420 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
28430 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
28440 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
28450 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
28460 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
28470 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
28480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28490 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
284a0 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
284b0 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
284c0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
284d0 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
284e0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
284f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
28500 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
28510 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
28520 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
28530 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
28540 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
28550 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
28560 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
28570 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
28580 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
28590 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
285a0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
285b0 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
285c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
285d0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
285e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
285f0 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
28600 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
28610 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
28620 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
28630 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
28640 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
28650 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
28660 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
28670 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
28680 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
28690 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
286a0 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
286b0 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
286c0 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
286d0 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
286e0 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
286f0 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
28700 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
28710 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
28720 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
28730 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
28740 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
28750 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
28760 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
28770 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
28780 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
28790 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
287a0 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
287b0 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
287c0 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
287d0 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
287e0 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
287f0 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
28800 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
28810 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
28820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28830 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
28840 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
28850 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
28860 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
28870 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72  r(pParse);.  for
28880 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
28890 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
288a0 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
288b0 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
288c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
288d0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
288e0 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
288f0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
28900 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
28910 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
28920 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
28930 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54  ;.  if( addrHitT
28940 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  est ){.    sqlit
28950 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
28960 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a  , addrHitTest);.
28970 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
28980 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70   a single OP_Exp
28990 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
289a0 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20   to the VDBE to 
289b0 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65  explain a simple
289c0 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65  .** count(*) que
289d0 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e  ry ("SELECT coun
289e0 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29  t(*) FROM pTab")
289f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
28a00 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
28a10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
28a20 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
28a30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
28a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28a50 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
28a60 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
28a70 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
28a80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
28a90 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  e being queried 
28aa0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
28ad0 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73  ed to optimize s
28ae0 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  can, or NULL */.
28af0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
28b00 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
28b10 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20     int bCover = 
28b20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73  (pIdx!=0 && (Has
28b30 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21  Rowid(pTab) || !
28b40 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
28b50 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63  x(pIdx)));.    c
28b60 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
28b70 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
28b80 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
28b90 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
28ba0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
28bb0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
28bc0 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  ? " USING COVERI
28bd0 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c  NG INDEX " : "",
28be0 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20  .        bCover 
28bf0 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
28c00 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
28c10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
28c20 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
28c30 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
28c40 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
28c50 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
28c60 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
28c70 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
28c80 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
28c90 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
28ca0 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
28cb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
28cc0 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
28cd0 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
28ce0 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
28cf0 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
28d00 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
28d10 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
28d20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
28d30 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
28d40 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
28d50 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
28d60 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
28d70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
28d80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
28d90 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
28da0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
28db0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
28dc0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
28dd0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
28de0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
28df0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
28e00 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
28e10 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
28e20 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
28e30 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
28e40 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
28e50 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
28e60 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
28e70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
28e80 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
28e90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
28ea0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
28eb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
28ec0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
28ed0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
28ee0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
28ef0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
28f00 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
28f10 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
28f20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
28f30 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
28f40 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
28f50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
28f60 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
28f70 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
28f80 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
28f90 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
28fa0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
28fb0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
28fc0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
28fd0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
28fe0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
28ff0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
29000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29010 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
29020 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
29030 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
29040 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
29050 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
29060 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
29070 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
29080 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
29090 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
290a0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
290b0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
290c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
290d0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
290e0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
290f0 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
29100 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
29110 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
29120 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
29130 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
29140 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
29150 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
29160 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
29170 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
29180 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
29190 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
291a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
291b0 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
291c0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
291d0 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
291e0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
291f0 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
29200 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
29210 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
29220 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
29230 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
29240 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
29250 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
29260 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
29270 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
29280 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
29290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
292a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
292b0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
292c0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
292d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
292e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
292f0 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
29300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
29310 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
29320 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
29330 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
29340 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
29350 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
29360 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
29370 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
29380 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
29390 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
293a0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
293b0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
293c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
293d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
293e0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
293f0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
29400 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
29410 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
29420 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
29430 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
29440 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
29450 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e  BLED.  pParse->n
29460 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a  SelectIndent++;.
29470 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
29480 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69  pParse,p, ("begi
29490 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22  n processing:\n"
294a0 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ));.  if( sqlite
294b0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
294c0 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x100 ){.    sqli
294d0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
294e0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
294f0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
29500 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
29510 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
29520 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29  !=SRT_DistFifo )
29530 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
29540 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
29550 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
29560 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  Fifo );.  assert
29570 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
29580 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
29590 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  !=SRT_DistQueue 
295a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
295b0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
295c0 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
295d0 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20  _Queue );.  if( 
295e0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
295f0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
29600 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
29610 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
29620 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
29630 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
29640 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
29650 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
29660 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
29670 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c  t==SRT_Discard |
29680 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
29690 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51  st->eDest==SRT_Q
296a0 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e  ueue  || pDest->
296b0 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
296c0 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ifo ||.         
296d0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
296e0 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c  SRT_DistQueue ||
296f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
29700 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a  RT_Fifo);.    /*
29710 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
29720 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
29730 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
29740 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
29750 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
29760 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
29770 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
29780 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
29790 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
297a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
297b0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
297c0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
297d0 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
297e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
297f0 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
29800 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p, 0);.  memset(
29810 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f  &sSort, 0, sizeo
29820 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f  f(sSort));.  sSo
29830 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
29840 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61  >pOrderBy;.  pTa
29850 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
29860 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
29870 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50 61  EList;.  if( pPa
29880 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
29890 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
298a0 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
298b0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67  _end;.  }.  isAg
298c0 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  g = (p->selFlags
298d0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
298e0 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  !=0;.  assert( p
298f0 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f  EList!=0 );..  /
29900 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
29910 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
29920 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
29930 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
29940 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
29950 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
29960 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65  If writing to me
29970 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69  mory or generati
29980 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e  ng a set.  ** on
29990 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  ly a single colu
299a0 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74  mn may be output
299b0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
299c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
299d0 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46  ERY.  if( checkF
299e0 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
299f0 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ectError(pParse,
29a00 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e   pDest, pEList->
29a10 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f  nExpr) ){.    go
29a20 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
29a30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
29a40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
29a50 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
29a60 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
29a70 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
29a80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
29a90 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
29aa0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
29ab0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
29ac0 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
29ad0 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
29ae0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
29af0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
29b00 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
29b10 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
29b20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
29b30 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
29b40 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
29b50 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
29b60 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
29b70 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
29b80 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
29b90 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
29ba0 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
29bb0 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
29bc0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
29bd0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
29be0 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
29bf0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
29c00 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
29c10 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
29c20 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
29c30 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
29c40 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
29c50 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
29c60 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
29c70 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
29c80 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
29c90 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
29ca0 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
29cb0 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
29cc0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
29cd0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
29ce0 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
29cf0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
29d00 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
29d10 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
29d20 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
29d30 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29d40 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20  viaCoroutine==0 
29d50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
29d60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29d70 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
29d80 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
29d90 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
29da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
29db0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
29dc0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
29dd0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
29de0 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
29df0 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
29e00 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
29e10 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  ee referred to b
29e20 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
29e30 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
29e40 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
29e50 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
29e60 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
29e70 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
29e80 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
29e90 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
29ea0 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
29eb0 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
29ec0 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
29ed0 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
29ee0 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
29ef0 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
29f00 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
29f10 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
29f20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
29f30 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
29f40 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
29f50 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67  ht(p);..    isAg
29f60 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
29f70 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
29f80 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
29f90 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
29fa0 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
29fb0 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
29fc0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
29fd0 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
29fe0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
29ff0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2a000 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
2a010 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
2a020 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
2a030 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2a040 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
2a050 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
2a060 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  -1;.    }else if
2a070 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
2a080 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==1.           &
2a090 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2a0a0 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2a0b0 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a  _SubqCoroutine).
2a0c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2a0d0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
2a0e0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2a0f0 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
2a100 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2a110 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
2a120 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
2a130 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
2a140 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
2a150 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2a160 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
2a170 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2a180 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2a190 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2a1a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2a1b0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
2a1c0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2a1d0 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
2a1e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2a1f0 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2a200 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2a210 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
2a220 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2a230 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
2a240 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2a250 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2a260 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2a270 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2a280 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2a290 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2a2a0 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2a2b0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2a2c0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2a2d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2a2e0 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2a2f0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2a300 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
2a310 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62  lite3LogEst(pSub
2a320 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
2a330 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43       pItem->viaC
2a340 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20  oroutine = 1;.  
2a350 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2a360 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73  sult = dest.iSds
2a370 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2a380 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2a390 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70  _EndCoroutine, p
2a3a0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2a3b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a3c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
2a3d0 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
2a3e0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2a3f0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2a400 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a410 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2a420 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2a430 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
2a440 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2a450 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
2a460 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
2a470 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
2a480 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
2a490 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
2a4a0 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
2a4b0 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
2a4c0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
2a4d0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2a4e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
2a4f0 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
2a500 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
2a510 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
2a520 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
2a530 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
2a540 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
2a550 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
2a560 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
2a570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
2a580 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
2a590 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
2a5a0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
2a5b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2a5c0 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
2a5d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a5e0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2a5f0 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
2a600 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
2a610 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2a620 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
2a630 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43    if( pItem->isC
2a640 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
2a650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
2a660 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
2a670 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
2a680 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
2a690 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
2a6a0 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
2a6b0 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
2a6c0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
2a6d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
2a6e0 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
2a6f0 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
2a700 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
2a710 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
2a720 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
2a730 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
2a740 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2a750 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2a760 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2a770 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2a780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a790 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
2a7a0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2a7b0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2a7c0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2a7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2a7e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
2a7f0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
2a800 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
2a810 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2a820 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
2a830 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
2a840 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
2a850 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
2a860 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2a870 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2a880 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2a890 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
2a8a0 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65  wLogEst = sqlite
2a8b0 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53  3LogEst(pSub->nS
2a8c0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
2a8d0 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
2a8e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2a8f0 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
2a900 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
2a910 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2a920 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2a930 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2a940 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
2a950 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2a960 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2a970 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2a980 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a990 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
2a9a0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
2a9b0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2a9c0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2a9d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2a9e0 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
2a9f0 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
2aa00 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
2aa10 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2aa20 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
2aa30 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
2aa40 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
2aa50 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
2aa60 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2aa70 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
2aa80 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2aa90 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
2aaa0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2aab0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
2aac0 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
2aad0 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
2aae0 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
2aaf0 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
2ab00 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
2ab10 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
2ab20 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
2ab30 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
2ab40 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2ab50 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
2ab60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ab70 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2ab80 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
2ab90 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
2aba0 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
2abb0 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
2abc0 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
2abd0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
2abe0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
2abf0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
2ac00 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
2ac10 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2ac20 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2ac30 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2ac40 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  Id);.#if SELECTT
2ac50 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
2ac60 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2ac70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f  Parse,p,("end co
2ac80 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72  mpound-select pr
2ac90 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
2aca0 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65     pParse->nSele
2acb0 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64  ctIndent--;.#end
2acc0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  if.    return rc
2acd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2ace0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
2acf0 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
2ad00 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
2ad10 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
2ad20 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
2ad30 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
2ad40 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
2ad50 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
2ad60 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
2ad70 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
2ad80 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
2ad90 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
2ada0 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
2adb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
2adc0 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
2add0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
2ade0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
2adf0 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
2ae00 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
2ae10 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
2ae20 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
2ae30 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a  xyz ORDER BY xyz
2ae40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2ae50 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
2ae60 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
2ae70 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
2ae80 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
2ae90 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
2aea0 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
2aeb0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
2aec0 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
2aed0 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
2aee0 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
2aef0 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
2af00 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
2af10 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
2af20 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
2af30 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
2af40 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
2af50 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
2af60 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
2af70 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
2af80 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2af90 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2afa0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
2afb0 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
2afc0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
2afd0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
2afe0 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  p->pEList, -1)==
2aff0 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
2b000 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2b010 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70  stinct;.    p->p
2b020 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
2b030 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
2b040 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a   p->pEList, 0);.
2b050 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
2b060 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
2b070 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65  /* Notice that e
2b080 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44  ven thought SF_D
2b090 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e  istinct has been
2b0a0 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d   cleared from p-
2b0b0 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a  >selFlags,.    *
2b0c0 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e  * the sDistinct.
2b0d0 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20  isTnct is still 
2b0e0 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54  set.  Hence, isT
2b0f0 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  nct represents t
2b100 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  he.    ** origin
2b110 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68  al setting of th
2b120 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c  e SF_Distinct fl
2b130 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72  ag, not the curr
2b140 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ent setting */. 
2b150 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74     assert( sDist
2b160 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20  inct.isTnct );. 
2b170 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
2b180 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
2b190 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
2b1a0 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
2b1b0 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
2b1c0 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
2b1d0 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
2b1e0 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
2b1f0 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
2b200 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
2b210 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2b220 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
2b230 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
2b240 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
2b250 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
2b260 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
2b270 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
2b280 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
2b290 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
2b2a0 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
2b2b0 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
2b2c0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2b2d0 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
2b2e0 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2b2f0 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2b300 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2b310 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2b320 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2b330 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2b340 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2b350 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73  rderBy, 0, pELis
2b360 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
2b370 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20  Sort.iECursor = 
2b380 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2b390 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2b3a0 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
2b3b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b3c0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2b3d0 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2b3e0 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c   sSort.iECursor,
2b3f0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d   sSort.pOrderBy-
2b400 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d  >nExpr+1+pEList-
2b410 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20  >nExpr, 0,.     
2b420 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2b430 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2b440 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  .      );.  }els
2b450 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  e{.    sSort.add
2b460 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
2b470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2b480 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
2b490 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
2b4a0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
2b4b0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
2b4c0 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
2b4d0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
2b4e0 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
2b4f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b500 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2b510 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
2b520 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2b530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2b540 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
2b550 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
2b560 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2b570 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  );.  p->nSelectR
2b580 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54  ow = LARGEST_INT
2b590 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  64;.  computeLim
2b5a0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
2b5b0 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
2b5c0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
2b5d0 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
2b5e0 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
2b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
2b600 4f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  Op(v, sSort.addr
2b610 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f  SortIndex)->opco
2b620 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70  de = OP_SorterOp
2b630 65 6e 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f  en;.    sSort.so
2b640 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46  rtFlags |= SORTF
2b650 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20  LAG_UseSorter;. 
2b660 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20   }..  /* Open a 
2b670 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
2b680 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
2b690 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
2b6a0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2b6b0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
2b6c0 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
2b6d0 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
2b6e0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
2b6f0 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
2b700 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
2b710 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2b720 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
2b750 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
2b760 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b780 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
2b790 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2b7a0 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
2b7b0 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20  ,0,0),.         
2b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7d0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
2b7e0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
2b7f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
2b800 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
2b810 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
2b820 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
2b830 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
2b840 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
2b850 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2b860 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2b870 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
2b880 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
2b890 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
2b8a0 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
2b8b0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
2b8c0 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
2b8d0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
2b8e0 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
2b8f0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2b900 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
2b910 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20  TINCT : 0);..   
2b920 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
2b930 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
2b940 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2b950 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2b960 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2b970 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
2b980 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
2b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9a0 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
2b9b0 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30  t, wctrlFlags, 0
2b9c0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
2b9d0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2b9e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2b9f0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2ba00 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2ba10 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
2ba20 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
2ba30 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
2ba40 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
2ba50 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
2ba60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
2ba70 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
2ba80 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
2ba90 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2baa0 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
2bab0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2bac0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2bad0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
2bae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
2baf0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2bb00 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
2bb10 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
2bb20 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2bb30 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
2bb40 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
2bb50 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
2bb60 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
2bb70 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
2bb80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2bb90 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
2bba0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
2bbb0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
2bbc0 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
2bbd0 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
2bbe0 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
2bbf0 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
2bc00 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
2bc10 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
2bc20 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
2bc30 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
2bc40 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
2bc50 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
2bc60 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
2bc70 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
2bc80 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2bc90 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
2bca0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
2bcb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2bcc0 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
2bcd0 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
2bce0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
2bcf0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
2bd00 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
2bd10 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
2bd20 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
2bd30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bd40 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
2bd50 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
2bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd70 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
2bd80 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
2bd90 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
2bda0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
2bdb0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
2bdc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2bdd0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
2bde0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
2bdf0 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
2be00 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
2be10 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
2be20 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
2be30 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
2be40 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
2be50 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
2be60 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
2be70 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
2be80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
2be90 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
2bea0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2beb0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2bec0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
2bed0 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
2bee0 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
2bef0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
2bf00 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
2bf10 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
2bf20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
2bf30 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
2bf40 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
2bf50 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
2bf60 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf80 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
2bf90 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
2bfa0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
2bfb0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
2bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfd0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
2bfe0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
2bff0 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
2c000 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
2c010 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
2c020 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
2c030 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
2c040 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
2c050 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
2c060 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
2c070 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
2c080 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
2c090 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
2c0a0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
2c0b0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
2c0c0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
2c0d0 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
2c0e0 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
2c0f0 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
2c100 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
2c110 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
2c120 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
2c130 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
2c140 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
2c150 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
2c160 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
2c170 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
2c180 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
2c190 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
2c1a0 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
2c1b0 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
2c1c0 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
2c1d0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
2c1e0 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
2c1f0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
2c200 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c220 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2c230 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
2c240 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
2c250 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
2c260 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
2c270 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
2c280 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
2c290 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
2c2a0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
2c2b0 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
2c2c0 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
2c2d0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
2c2e0 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
2c2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
2c300 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
2c310 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
2c320 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
2c330 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2c340 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
2c350 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
2c360 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
2c370 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70  electRow>100 ) p
2c380 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31  ->nSelectRow = 1
2c390 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  00;.    }else{. 
2c3a0 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
2c3b0 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 0a  ow = 1;.    }...
2c3c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2c3d0 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
2c3e0 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
2c3f0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
2c400 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64  ey are.    ** id
2c410 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74  entical, then it
2c420 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
2c430 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
2c440 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2c450 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67  .    ** on the g
2c460 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20  rounds that the 
2c470 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61  GROUP BY will ca
2c480 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
2c490 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a  come out .    **
2c4a0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
2c4b0 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d  order. It also m
2c4c0 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f  ay not - the GRO
2c4d0 55 50 20 42 59 20 6d 61 79 20 75 73 65 20 61 0a  UP BY may use a.
2c4e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2c4f0 69 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65  index that cause
2c500 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f  s rows to be gro
2c510 75 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73  uped together as
2c520 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a   required.    **
2c530 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
2c540 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72  y sorted. Either
2c550 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65   way, record the
2c560 20 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20   fact that the. 
2c570 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61     ** ORDER BY a
2c580 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
2c590 73 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ses are the same
2c5a0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
2c5b0 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a  orderByGrp.    *
2c5c0 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a  * variable.  */.
2c5d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
2c5e0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
2c5f0 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70  GroupBy, sSort.p
2c600 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20  OrderBy, -1)==0 
2c610 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79  ){.      orderBy
2c620 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Grp = 1;.    }. 
2c630 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2c640 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
2c650 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
2c660 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
2c670 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
2c680 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2c690 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
2c6a0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
2c6b0 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
2c6c0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
2c6d0 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
2c6e0 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
2c6f0 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
2c700 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
2c710 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
2c720 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
2c730 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2c740 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
2c750 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
2c760 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
2c770 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2c780 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
2c790 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
2c7a0 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
2c7b0 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
2c7c0 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20   sAggInfo.mnReg 
2c7d0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
2c7e0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  ;.    sAggInfo.n
2c7f0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20  SortingColumn = 
2c800 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75  pGroupBy ? pGrou
2c810 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  pBy->nExpr : 0;.
2c820 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72      sAggInfo.pGr
2c830 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2c840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2c850 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
2c860 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20  &sNC, pEList);. 
2c870 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2c880 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2c890 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  C, sSort.pOrderB
2c8a0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
2c8b0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
2c8c0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2c8d0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
2c8e0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
2c8f0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
2c900 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
2c910 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
2c920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2c930 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
2c940 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c950 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2c960 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
2c970 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
2c980 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2c990 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
2c9a0 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
2c9b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2c9c0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2c9d0 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
2c9e0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
2c9f0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
2ca00 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
2ca10 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
2ca20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
2ca30 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
2ca40 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
2ca50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2ca60 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2ca70 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
2ca80 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
2ca90 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
2caa0 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
2cab0 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
2cac0 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
2cad0 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
2cae0 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
2caf0 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
2cb00 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2cb10 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2cb20 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
2cb30 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
2cb40 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
2cb50 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
2cb60 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
2cb70 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
2cb80 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
2cb90 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2cba0 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
2cbb0 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
2cbc0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2cbd0 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
2cbe0 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
2cbf0 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
2cc00 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
2cc10 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
2cc20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
2cc30 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
2cc40 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
2cc50 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
2cc60 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
2cc70 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
2cc80 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
2cc90 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
2cca0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2ccb0 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
2ccc0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
2ccd0 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
2cce0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
2ccf0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
2cd00 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
2cd10 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
2cd20 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
2cd30 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
2cd40 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
2cd50 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
2cd60 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
2cd70 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
2cd80 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
2cd90 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
2cda0 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
2cdb0 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
2cdc0 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
2cdd0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
2cde0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
2cdf0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
2ce00 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
2ce10 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
2ce20 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
2ce30 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
2ce40 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
2ce50 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
2ce60 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
2ce70 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
2ce80 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
2ce90 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
2cea0 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
2ceb0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2cec0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
2ced0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2cee0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2cef0 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f  pBy, 0, sAggInfo
2cf00 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
2cf10 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
2cf20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2cf30 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
2cf40 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
2cf50 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2cf60 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
2cf70 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
2cf80 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
2cf90 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
2cfa0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
2cfb0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2cfc0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
2cfd0 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
2cfe0 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
2cff0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
2d000 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
2d010 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2d020 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
2d030 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
2d040 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
2d050 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
2d060 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
2d070 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
2d080 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
2d090 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
2d0a0 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
2d0b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
2d0c0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
2d0d0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2d0e0 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
2d0f0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
2d100 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
2d110 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
2d120 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2d130 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
2d140 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2d150 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2d160 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2d170 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2d180 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2d190 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
2d1a0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
2d1b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2d1c0 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
2d1d0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2d1e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d1f0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
2d200 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
2d210 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2d220 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
2d230 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
2d240 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d250 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2d260 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
2d270 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
2d280 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
2d290 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
2d2a0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
2d2b0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
2d2c0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2d2d0 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
2d2e0 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
2d2f0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
2d300 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
2d310 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
2d320 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
2d330 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
2d340 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
2d350 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
2d360 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
2d370 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
2d380 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
2d390 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
2d3a0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2d3b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d3c0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
2d3d0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
2d3e0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
2d3f0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
2d400 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2d410 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
2d420 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
2d430 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
2d440 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
2d450 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
2d460 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
2d470 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
2d480 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2d490 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
2d4a0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
2d4b0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
2d4c0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
2d4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2d4e0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
2d4f0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
2d500 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
2d510 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
2d520 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
2d530 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
2d540 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2d550 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
2d560 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
2d570 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
2d580 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
2d590 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
2d5a0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
2d5b0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
2d5c0 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
2d5d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2d5e0 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
2d5f0 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
2d600 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
2d610 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
2d620 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
2d630 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
2d640 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
2d650 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
2d660 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2d670 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
2d680 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
2d690 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
2d6a0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
2d6b0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
2d6c0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
2d6d0 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
2d6e0 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
2d6f0 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
2d700 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
2d710 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
2d720 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
2d730 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2d740 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2d750 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
2d760 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
2d770 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
2d780 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
2d790 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
2d7a0 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
2d7b0 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
2d7c0 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
2d7d0 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
2d7e0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2d7f0 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
2d800 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2d810 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
2d820 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2d830 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2d840 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2d850 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
2d860 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
2d870 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2d880 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
2d890 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2d8a0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2d8b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d8c0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
2d8d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2d8e0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
2d8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2d900 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2d910 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2d920 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2d930 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d940 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
2d950 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20  , 0);.        j 
2d960 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
2d970 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2d980 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2d990 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2d9a0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2d9b0 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67  col *pCol = &sAg
2d9c0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20  gInfo.aCol[i];. 
2d9d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
2d9e0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
2d9f0 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=j ){.         
2da00 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20     int r1 = j + 
2da10 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2da20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20       int r2;..  
2da30 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73            r2 = s
2da40 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
2da50 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
2da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da80 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
2da90 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
2daa0 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b  >iTable, r1, 0);
2dab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2dac0 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20   r1!=r2 ){.     
2dad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dae0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2daf0 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b  _SCopy, r2, r1);
2db00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2db10 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2db20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2db30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2db40 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
2db50 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
2db60 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2db70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2db80 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
2db90 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20   regBase, nCol, 
2dba0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2dbb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2dbc0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2dbd0 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e  erInsert, sAggIn
2dbe0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72  fo.sortingIdx, r
2dbf0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2dc00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2dc10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
2dc20 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
2dc30 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
2dc40 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2dc50 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  rse, regBase, nC
2dc60 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2dc70 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2dc80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41  nfo);.        sA
2dc90 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2dca0 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62  xPTab = sortPTab
2dcb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2dcc0 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f  +;.        sortO
2dcd0 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ut = sqlite3GetT
2dce0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2dcf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2dd00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2dd10 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74  OpenPseudo, sort
2dd20 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e  PTab, sortOut, n
2dd30 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2dd40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2dd50 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
2dd60 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2dd70 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b  ngIdx, addrEnd);
2dd80 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
2dd90 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20  ment((v, "GROUP 
2dda0 42 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65  BY sort")); Vdbe
2ddb0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
2ddc0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
2ddd0 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
2dde0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ddf0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2de00 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d  Parse);..      }
2de10 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2de20 65 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f  e index or tempo
2de30 72 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20  rary table used 
2de40 62 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  by the GROUP BY 
2de50 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  sort.      ** wi
2de60 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c  ll naturally del
2de70 69 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65  iver rows in the
2de80 20 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20   order required 
2de90 62 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  by the ORDER BY.
2dea0 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c        ** clause,
2deb0 20 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65   cancel the ephe
2dec0 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e  meral table open
2ded0 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a   coded earlier..
2dee0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2def0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
2df00 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20  imization - the 
2df10 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73  correct answer s
2df20 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67  hould result reg
2df30 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a  ardless..      *
2df40 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45  * Use the SQLITE
2df50 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c  _GroupByOrder fl
2df60 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54  ag with SQLITE_T
2df70 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45  ESTCTRL_OPTIMIZE
2df80 52 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64  R to .      ** d
2df90 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
2dfa0 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
2dfb0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
2dfc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64  */.      if( ord
2dfd0 65 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d  erByGrp && Optim
2dfe0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2dff0 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  b, SQLITE_GroupB
2e000 79 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20  yOrder) .       
2e010 26 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20  && (groupBySort 
2e020 7c 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  || sqlite3WhereI
2e030 73 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29  sSorted(pWInfo))
2e040 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2e050 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2e060 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
2e070 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2e080 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61  oNoop(v, sSort.a
2e090 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20  ddrSortIndex);. 
2e0a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2e0b0 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75   Evaluate the cu
2e0c0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2e0d0 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69  erms and store i
2e0e0 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a  n b0, b1, b2....
2e0f0 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20        ** (b0 is 
2e100 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2e110 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69  iBMem+0, b1 is i
2e120 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66  BMem+1, and so f
2e130 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54  orth).      ** T
2e140 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20  hen compare the 
2e150 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
2e160 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74   terms against t
2e170 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  he GROUP BY term
2e180 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
2e190 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
2e1a0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
2e1b0 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e  d in a0, a1, a2.
2e1c0 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
2e1d0 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20    addrTopOfLoop 
2e1e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2e1f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2e200 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2e210 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2e220 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  ;.      if( grou
2e230 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2e240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2e250 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp3(v, OP_Sorte
2e260 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e  rData, sAggInfo.
2e270 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74  sortingIdx, sort
2e280 4f 75 74 2c 73 6f 72 74 50 54 61 62 29 3b 0a 20  Out,sortPTab);. 
2e290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2e2a0 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
2e2b0 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
2e2c0 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
2e2d0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2e2e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2e2f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
2e300 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
2e310 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2e320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e330 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
2e340 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
2e350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2e360 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2e370 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
2e380 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
2e390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e3a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e3b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
2e3c0 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
2e3d0 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
2e3e0 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e400 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
2e410 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
2e420 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
2e430 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  ;.      j1 = sql
2e440 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2e450 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2e460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2e470 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31  v, OP_Jump, j1+1
2e480 2c 20 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65  , 0, j1+1); Vdbe
2e490 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
2e4a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2e4b0 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
2e4c0 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
2e4d0 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
2e4e0 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
2e4f0 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
2e500 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
2e510 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
2e520 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
2e530 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
2e540 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
2e550 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
2e560 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
2e570 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
2e580 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
2e590 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
2e5a0 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
2e5b0 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
2e5c0 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
2e5d0 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
2e5e0 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
2e5f0 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
2e600 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2e610 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2e620 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
2e630 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
2e640 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
2e650 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
2e660 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e670 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
2e680 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
2e690 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2e6a0 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
2e6b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e6c0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
2e6d0 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
2e6e0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2e6f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
2e700 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
2e710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2e720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2e730 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
2e740 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62  g, addrEnd); Vdb
2e750 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2e760 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2e770 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
2e780 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2e790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2e7a0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2e7b0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2e7c0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
2e7d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
2e7e0 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
2e7f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2e800 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
2e810 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
2e820 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
2e830 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
2e840 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
2e850 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2e860 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2e870 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
2e880 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2e890 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2e8a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
2e8b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e8c0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
2e8d0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2e8e0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2e8f0 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
2e900 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
2e910 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
2e920 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
2e930 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2e940 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2e950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2e960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2e970 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
2e980 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2e990 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
2e9a0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
2e9b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
2e9c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2e9d0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2e9e0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
2e9f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2ea00 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
2ea10 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
2ea20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
2ea30 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
2ea40 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
2ea50 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2ea60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ea70 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
2ea80 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
2ea90 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
2eaa0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
2eab0 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
2eac0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
2ead0 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
2eae0 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
2eaf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2eb00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2eb10 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29  oto, 0, addrEnd)
2eb20 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2eb30 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2eb40 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
2eb50 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
2eb60 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
2eb70 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
2eb80 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
2eb90 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
2eba0 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
2ebb0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
2ebc0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2ebd0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
2ebe0 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
2ebf0 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
2ec00 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
2ec10 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
2ec20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
2ec30 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
2ec40 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
2ec50 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
2ec60 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
2ec70 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
2ec80 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
2ec90 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
2eca0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
2ecb0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
2ecc0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
2ecd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2ece0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2ecf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ed00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2ed10 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
2ed20 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2ed30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
2ed40 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
2ed50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ed60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2ed70 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2ed80 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
2ed90 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2eda0 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
2edb0 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
2edc0 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
2edd0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2ede0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2edf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2ee00 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
2ee10 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
2ee20 6f 77 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  ow+2); VdbeCover
2ee30 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
2ee40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2ee50 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
2ee60 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
2ee70 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
2ee80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ee90 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
2eea0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
2eeb0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
2eec0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
2eed0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2eee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2eef0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
2ef00 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
2ef10 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
2ef20 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
2ef30 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2ef40 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
2ef50 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
2ef60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
2ef70 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69           &sDisti
2ef80 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efa0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b    addrOutputRow+
2efb0 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29  1, addrSetAbort)
2efc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2efd0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2efe0 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2eff0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
2f000 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
2f010 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74  d groupby result
2f020 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a   generator"));..
2f030 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2f040 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2f050 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74  hat will reset t
2f060 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75  he group-by accu
2f070 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f  mulator.      */
2f080 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f090 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2f0a0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
2f0b0 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c      resetAccumul
2f0c0 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
2f0d0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
2f0e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2f0f0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2f100 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a  egReset);.     .
2f110 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70      } /* endif p
2f120 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20  GroupBy.  Begin 
2f130 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
2f140 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20  s without GROUP 
2f150 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  BY: */.    else 
2f160 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
2f170 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e   *pDel = 0;.#ifn
2f180 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f190 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20  BTREECOUNT.     
2f1a0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
2f1b0 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20      if( (pTab = 
2f1c0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c  isSimpleCount(p,
2f1d0 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20   &sAggInfo))!=0 
2f1e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2f1f0 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29   isSimpleCount()
2f200 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
2f210 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74  er to a Table st
2f220 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20  ructure, then.  
2f230 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c        ** the SQL
2f240 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66   statement is of
2f250 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20   the form:.     
2f260 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2f270 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
2f280 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20  *) FROM <tbl>.  
2f290 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2f2a0 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61   ** where the Ta
2f2b0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65  ble structure re
2f2c0 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74  turned represent
2f2d0 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20  s table <tbl>.. 
2f2e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2f2f0 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d    ** This statem
2f300 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e  ent is so common
2f310 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69   that it is opti
2f320 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e  mized specially.
2f330 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
2f340 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63  OP_Count instruc
2f350 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
2f360 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69   either on the i
2f370 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74  ntkey table that
2f380 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
2f390 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f  ains the data fo
2f3a0 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72  r table <tbl> or
2f3b0 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69   on one of its i
2f3c0 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20  ndexes. It.     
2f3d0 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20     ** is better 
2f3e0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f  to execute the o
2f3f0 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61  p on an index, a
2f400 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c  s indexes are al
2f410 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  most.        ** 
2f420 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63  always spread ac
2f430 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20  ross less pages 
2f440 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65  than their corre
2f450 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e  sponding tables.
2f460 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2f470 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
2f480 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
2f490 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
2f4a0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
2f4b0 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ma);.        con
2f4c0 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50  st int iCsr = pP
2f4d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
2f4e0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73    /* Cursor to s
2f4f0 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  can b-tree */.  
2f500 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
2f510 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2f520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2f530 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2f540 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  */.        KeyIn
2f550 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30  fo *pKeyInfo = 0
2f560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f570 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73  /* Keyinfo for s
2f580 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a  canned index */.
2f590 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2f5a0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f5c0 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64  Best index found
2f5d0 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
2f5e0 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70     int iRoot = p
2f5f0 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20  Tab->tnum;      
2f600 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
2f610 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20  page of scanned 
2f620 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20  b-tree */..     
2f630 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
2f640 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
2f650 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
2f660 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
2f670 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
2f680 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54  Tab->tnum, 0, pT
2f690 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  ab->zName);..   
2f6a0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2f6b0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61  or the index tha
2f6c0 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74  t has the lowest
2f6d0 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20   scan cost..    
2f6e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f6f0 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44  * (2011-04-15) D
2f700 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20  o not do a full 
2f710 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64  scan of an unord
2f720 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20  ered index..    
2f730 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f740 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44  * (2013-10-03) D
2f750 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20  o not count the 
2f760 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61 72  entries in a par
2f770 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20  tial index..    
2f780 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f790 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74 68  * In practice th
2f7a0 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
2f7b0 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ure will not be 
2f7c0 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79  used. It is only
2f7d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73   .        ** pas
2f7e0 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f  sed to keep OP_O
2f7f0 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20  penRead happy.. 
2f800 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f810 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
2f820 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d 20  pTab) ) pBest = 
2f830 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
2f840 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
2f850 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
2f860 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
2f870 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
2f880 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
2f890 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
2f8a0 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20  ered==0.        
2f8b0 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64     && pIdx->szId
2f8c0 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62  xRow<pTab->szTab
2f8d0 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  Row.           &
2f8e0 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  & pIdx->pPartIdx
2f8f0 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20  Where==0.       
2f900 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c      && (!pBest |
2f910 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  | pIdx->szIdxRow
2f920 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77  <pBest->szIdxRow
2f930 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
2f940 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74             pBest
2f950 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
2f960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2f970 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74         if( pBest
2f980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52   ){.          iR
2f990 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75  oot = pBest->tnu
2f9a0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  m;.          pKe
2f9b0 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
2f9c0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
2f9d0 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20  arse, pBest);.  
2f9e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2f9f0 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d   /* Open a read-
2fa00 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65  only cursor, exe
2fa10 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e  cute the OP_Coun
2fa20 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72  t, close the cur
2fa30 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  sor. */.        
2fa40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2fa50 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52  4Int(v, OP_OpenR
2fa60 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74  ead, iCsr, iRoot
2fa70 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20  , iDb, 1);.     
2fa80 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
2fa90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2faa0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
2fab0 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29  (v, -1, (char *)
2fac0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2fad0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d  INFO);.        }
2fae0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2faf0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2fb00 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41  _Count, iCsr, sA
2fb10 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e  ggInfo.aFunc[0].
2fb20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
2fb30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2fb40 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43  (v, OP_Close, iC
2fb50 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  sr);.        exp
2fb60 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
2fb70 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42  pParse, pTab, pB
2fb80 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
2fb90 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
2fba0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
2fbb0 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  NT */.      {.  
2fbc0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
2fbd0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f  f the query is o
2fbe0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  f one of the fol
2fbf0 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20  lowing forms:.  
2fc00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2fc10 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e   **   SELECT min
2fc20 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
2fc30 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2fc40 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   max(x) FROM ...
2fc50 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2fc60 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c      ** If it is,
2fc70 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f   then ask the co
2fc80 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f  de in where.c to
2fc90 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74   attempt to sort
2fca0 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20   results.       
2fcb0 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
2fcc0 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
2fcd0 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
2fce0 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
2fcf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20   .        ** If 
2fd00 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20  where.c is able 
2fd10 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c  to produce resul
2fd20 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69  ts sorted in thi
2fd30 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  s order, then.  
2fd40 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62        ** add vdb
2fd50 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20  e code to break 
2fd60 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65  out of the proce
2fd70 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72  ssing loop after
2fd80 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
2fd90 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
2fda0 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
2fdb0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
2fdc0 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
2fdd0 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
2fde0 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  d to operate on 
2fdf0 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65  the row with the
2fe00 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69   minimum or maxi
2fe10 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  mum .        ** 
2fe20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20  value of x, the 
2fe30 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65  only row require
2fe40 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  d)..        **. 
2fe50 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63         ** A spec
2fe60 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65  ial flag must be
2fe70 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
2fe80 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74  e3WhereBegin() t
2fe90 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  o slightly.     
2fea0 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
2feb0 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73  avior as follows
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 2b 20 49 66 20 74       **   + If t
2fee0 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
2fef0 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
2ff00 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
2ff10 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  ed by.        **
2ff20 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
2ff30 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
2ff40 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
2ff50 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
2ff60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
2ff70 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20   for x..        
2ff80 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2ff90 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20  + The optimizer 
2ffa0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
2ffb0 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74 20  (the thing that 
2ffc0 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20 20  decides which.  
2ffd0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
2ffe0 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
2fff0 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
30000 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
30010 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
30020 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
30030 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
30040 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
30050 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
30060 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20  r cases..       
30070 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f   **     Refer to
30080 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e   code and commen
30090 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f  ts in where.c fo
300a0 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20  r details..     
300b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78     */.        Ex
300c0 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
300d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
300e0 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44  flag = WHERE_ORD
300f0 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  ERBY_NORMAL;.   
30100 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61 73       .        as
30110 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
30120 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
30130 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
30140 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
30150 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a  ->pHaving==0 ){.
30160 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
30170 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41   minMaxQuery(&sA
30180 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78  ggInfo, &pMinMax
30190 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
301a0 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
301b0 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78  g==0 || (pMinMax
301c0 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e  !=0 && pMinMax->
301d0 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20  nExpr==1) );..  
301e0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
301f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  {.          pMin
30200 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
30210 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69  rListDup(db, pMi
30220 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  nMax, 0);.      
30230 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d      pDel = pMinM
30240 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ax;.          if
30250 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
30260 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
30270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  {.            pM
30280 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
30290 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
302a0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
302b0 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20  ?1:0;.          
302c0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
302d0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
302e0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20  OLUMN;.         
302f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a   }.        }.  .
30300 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
30310 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65  case runs if the
30320 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e   aggregate has n
30330 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
30340 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20  e.  The.        
30350 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
30360 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
30370 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
30380 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
30390 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74         ** of out
303a0 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  put..        */.
303b0 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63          resetAcc
303c0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
303d0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
303e0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
303f0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
30400 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
30410 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61  , pWhere, pMinMa
30420 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20  x,0,flag,0);.   
30430 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
30440 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30450 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
30460 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
30470 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30480 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
30490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70      }.        up
304a0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
304b0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
304c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  o);.        asse
304d0 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  rt( pMinMax==0 |
304e0 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  | pMinMax->nExpr
304f0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==1 );.        i
30500 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
30510 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
30520 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
30530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30540 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
30550 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
30560 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
30570 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
30580 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
30590 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
305b0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
305c0 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
305d0 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
305e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
305f0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
30600 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
30610 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
30620 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
30630 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
30640 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30650 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
30660 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
30670 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
30680 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
30690 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
306a0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
306b0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
306c0 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30  pEList, -1, 0, 0
306d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
306e0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
306f0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
30700 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30710 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
30720 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
30730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
30740 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
30750 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
30760 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
30770 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
30780 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65   if( sDistinct.e
30790 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
307a0 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
307b0 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  ED ){.    explai
307c0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
307d0 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a  e, "DISTINCT");.
307e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
307f0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
30800 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
30810 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
30820 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
30830 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
30840 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
30850 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
30860 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
30870 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  rBy ){.    expla
30880 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
30890 73 65 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  se, sSort.nOBSat
308a0 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54  >0 ? "RIGHT PART
308b0 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f   OF ORDER BY":"O
308c0 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
308d0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
308e0 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72  pParse, p, &sSor
308f0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
30900 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
30910 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
30920 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
30930 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
30940 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
30950 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
30960 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
30970 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
30980 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
30990 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
309a0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
309b0 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
309c0 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
309d0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
309e0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
309f0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
30a00 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
30a10 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
30a20 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
30a30 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
30a40 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
30a50 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
30a60 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
30a70 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
30a80 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
30a90 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72  olumn names if r
30aa0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
30ab0 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f  LECT are to be o
30ac0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
30ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30ae0 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  && pDest->eDest=
30af0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
30b00 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
30b10 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
30b20 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
30b30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
30b40 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
30b50 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
30b60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
30b70 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
30b80 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
30b90 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54  ENABLED.  SELECT
30ba0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
30bb0 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e  ,("end processin
30bc0 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65  g\n"));.  pParse
30bd0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
30be0 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  -;.#endif.  retu
30bf0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
30c00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
30c10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
30c20 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
30c30 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74  scription of a t
30c40 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
30c50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
30c60 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
30c70 54 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c  TreeView *pView,
30c80 20 63 6f 6e 73 74 20 53 65 6c 65 63 74 20 2a 70   const Select *p
30c90 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f  , u8 moreToFollo
30ca0 77 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  w){.  int n = 0;
30cb0 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74  .  pView = sqlit
30cc0 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70  e3TreeViewPush(p
30cd0 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c  View, moreToFoll
30ce0 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 72  ow);.  sqlite3Tr
30cf0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
30d00 2c 20 22 53 45 4c 45 43 54 25 73 25 73 22 2c 0a  , "SELECT%s%s",.
30d10 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c 61 67      ((p->selFlag
30d20 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
30d30 20 3f 20 22 20 44 49 53 54 49 4e 43 54 22 20 3a   ? " DISTINCT" :
30d40 20 22 22 29 2c 0a 20 20 20 20 28 28 70 2d 3e 73   ""),.    ((p->s
30d50 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
30d60 72 65 67 61 74 65 29 20 3f 20 22 20 61 67 67 5f  regate) ? " agg_
30d70 66 6c 61 67 22 20 3a 20 22 22 29 0a 20 20 29 3b  flag" : "").  );
30d80 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26  .  if( p->pSrc &
30d90 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20  & p->pSrc->nSrc 
30da0 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ) n++;.  if( p->
30db0 70 57 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20 20  pWhere ) n++;.  
30dc0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
30dd0 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ) n++;.  if( p->
30de0 70 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a 20  pHaving ) n++;. 
30df0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
30e00 20 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d   ) n++;.  if( p-
30e10 3e 70 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a 20  >pLimit ) n++;. 
30e20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
30e30 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ) n++;.  if( p->
30e40 70 50 72 69 6f 72 20 29 20 6e 2b 2b 3b 0a 20 20  pPrior ) n++;.  
30e50 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
30e60 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70  xprList(pView, p
30e70 2d 3e 70 45 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e  ->pEList, (n--)>
30e80 30 2c 20 22 72 65 73 75 6c 74 2d 73 65 74 22 29  0, "result-set")
30e90 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
30ea0 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  && p->pSrc->nSrc
30eb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
30ec0 20 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74     pView = sqlit
30ed0 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70  e3TreeViewPush(p
30ee0 56 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  View, (n--)>0);.
30ef0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
30f00 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
30f10 46 52 4f 4d 22 29 3b 0a 20 20 20 20 66 6f 72 28  FROM");.    for(
30f20 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
30f30 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
30f40 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
30f50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
30f60 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
30f70 20 20 20 20 20 53 74 72 41 63 63 75 6d 20 78 3b       StrAccum x;
30f80 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e  .      char zLin
30f90 65 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 73 71  e[100];.      sq
30fa0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
30fb0 74 28 26 78 2c 20 7a 4c 69 6e 65 2c 20 73 69 7a  t(&x, zLine, siz
30fc0 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b 0a  eof(zLine), 0);.
30fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
30fe0 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 7b 25 64  intf(&x, 0, "{%d
30ff0 2c 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75  ,*}", pItem->iCu
31000 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
31010 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
31020 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
31030 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
31040 30 2c 20 22 20 25 73 2e 25 73 22 2c 20 70 49 74  0, " %s.%s", pIt
31050 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70  em->zDatabase, p
31060 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
31070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
31080 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
31090 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
310a0 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25 73  intf(&x, 0, " %s
310b0 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ", pItem->zName)
310c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
310d0 69 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20  if( pItem->pTab 
310e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
310f0 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c  e3XPrintf(&x, 0,
31100 20 22 20 74 61 62 6e 61 6d 65 3d 25 51 22 2c 20   " tabname=%Q", 
31110 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
31120 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
31130 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
31140 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
31150 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
31160 78 2c 20 30 2c 20 22 20 28 41 53 20 25 73 29 22  x, 0, " (AS %s)"
31170 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  , pItem->zAlias)
31180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31190 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  if( pItem->joint
311a0 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b  ype & JT_LEFT ){
311b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
311c0 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22  XPrintf(&x, 0, "
311d0 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20   LEFT-JOIN");.  
311e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
311f0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
31200 68 28 26 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  h(&x);.      sql
31210 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
31220 28 70 56 69 65 77 2c 20 7a 4c 69 6e 65 2c 20 69  (pView, zLine, i
31230 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31  <p->pSrc->nSrc-1
31240 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 70 49  ); .      if( pI
31250 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
31260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
31270 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56  reeViewSelect(pV
31280 69 65 77 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  iew, pItem->pSel
31290 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ect, 0);.      }
312a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
312b0 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
312c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
312d0 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
312e0 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28  View);.  }.  if(
312f0 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
31300 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31310 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 57 48  wItem(pView, "WH
31320 45 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a  ERE", (n--)>0);.
31330 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31340 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
31350 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
31360 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
31370 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d  wPop(pView);.  }
31380 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
31390 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
313a0 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73  3TreeViewExprLis
313b0 74 28 70 56 69 65 77 2c 20 70 2d 3e 70 47 72 6f  t(pView, p->pGro
313c0 75 70 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22  upBy, (n--)>0, "
313d0 47 52 4f 55 50 42 59 22 29 3b 0a 20 20 7d 0a 20  GROUPBY");.  }. 
313e0 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20   if( p->pHaving 
313f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
31400 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
31410 2c 20 22 48 41 56 49 4e 47 22 2c 20 28 6e 2d 2d  , "HAVING", (n--
31420 29 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )>0);.    sqlite
31430 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
31440 69 65 77 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  iew, p->pHaving,
31450 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
31460 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
31470 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  w);.  }.  if( p-
31480 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
31490 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
314a0 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20  ExprList(pView, 
314b0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 28 6e 2d  p->pOrderBy, (n-
314c0 2d 29 3e 30 2c 20 22 4f 52 44 45 52 42 59 22 29  -)>0, "ORDERBY")
314d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
314e0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
314f0 69 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d  ite3TreeViewItem
31500 28 70 56 69 65 77 2c 20 22 4c 49 4d 49 54 22 2c  (pView, "LIMIT",
31510 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73   (n--)>0);.    s
31520 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
31530 70 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4c 69  pr(pView, p->pLi
31540 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  mit, 0);.    sql
31550 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28  ite3TreeViewPop(
31560 70 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66  pView);.  }.  if
31570 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
31580 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
31590 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22  iewItem(pView, "
315a0 4f 46 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e 30  OFFSET", (n--)>0
315b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
315c0 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77  eeViewExpr(pView
315d0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30 29  , p->pOffset, 0)
315e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
315f0 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
31600 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50  .  }.  if( p->pP
31610 72 69 6f 72 20 29 7b 0a 20 20 20 20 63 6f 6e 73  rior ){.    cons
31620 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 22 55  t char *zOp = "U
31630 4e 49 4f 4e 22 3b 0a 20 20 20 20 73 77 69 74 63  NION";.    switc
31640 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
31650 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
31660 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 55 4e         zOp = "UN
31670 49 4f 4e 20 41 4c 4c 22 3b 20 20 62 72 65 61 6b  ION ALL";  break
31680 3b 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  ;.      case TK_
31690 49 4e 54 45 52 53 45 43 54 3a 20 20 20 7a 4f 70  INTERSECT:   zOp
316a0 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
316b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
316c0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
316d0 20 20 20 7a 4f 70 20 3d 20 22 45 58 43 45 50 54     zOp = "EXCEPT
316e0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
316f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54    }.    sqlite3T
31700 72 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65  reeViewItem(pVie
31710 77 2c 20 7a 4f 70 2c 20 28 6e 2d 2d 29 3e 30 29  w, zOp, (n--)>0)
31720 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
31730 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65  eViewSelect(pVie
31740 77 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 30 29  w, p->pPrior, 0)
31750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
31760 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
31770 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 72  .  }.  sqlite3Tr
31780 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29  eeViewPop(pView)
31790 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
317a0 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a        LITE_DEBUG */.