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

Artifact e7d3f26dd2bb513049c6c585919aa195c862a287:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 28 53 29 2d 3e 7a 53 65 6c  2-2,"",(S)->zSel
02e0: 4e 61 6d 65 2c 28 53 29 29 2c 5c 0a 20 20 20 20  Name,(S)),\.    
02f0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0300: 74 66 20 58 0a 23 65 6c 73 65 0a 23 20 64 65 66  tf X.#else.# def
0310: 69 6e 65 20 53 45 4c 45 43 54 54 52 41 43 45 28  ine SELECTTRACE(
0320: 4b 2c 50 2c 53 2c 58 29 0a 23 65 6e 64 69 66 0a  K,P,S,X).#endif.
0330: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0340: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0350: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0360: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0370: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0380: 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  ** how to proces
0390: 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  s the DISTINCT k
03a0: 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70 6c  eyword, to simpl
03b0: 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61 74  ify passing that
03c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
03d0: 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74 49  into the selectI
03e0: 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74 69  nnerLoop() routi
03f0: 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ne..*/.typedef s
0400: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0410: 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a 73  x DistinctCtx;.s
0420: 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43 74  truct DistinctCt
0430: 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74 3b  x {.  u8 isTnct;
0440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0450: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
0460: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
0470: 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54 79   */.  u8 eTnctTy
0480: 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  pe;   /* One of 
0490: 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  the WHERE_DISTIN
04a0: 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20 2a  CT_* operators *
04b0: 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74 3b  /.  int tabTnct;
04c0: 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61 6c      /* Ephemeral
04d0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
04e0: 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
04f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ing */.  int add
0500: 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64 72  rTnct;   /* Addr
0510: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
0520: 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20 66  hemeral opcode f
0530: 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d 3b  or tabTnct */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0550: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
0560: 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20 75  wing object is u
0570: 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69 6e  sed to record in
0580: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a  formation about.
0590: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
05a0: 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c  (or GROUP BY) cl
05b0: 61 75 73 65 20 6f 66 20 71 75 65 72 79 20 69 73  ause of query is
05c0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 0a 2a 2f   being coded..*/
05d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05e0: 53 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b  SortCtx SortCtx;
05f0: 0a 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20  .struct SortCtx 
0600: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
0610: 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
0620: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
0630: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a  OUP BY clause) *
0640: 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20  /.  int nOBSat; 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0660: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
0670: 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
0680: 62 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  by indices */.  
0690: 69 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20  int iECursor;   
06a0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
06b0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
06c0: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  orter */.  int r
06d0: 65 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20  egReturn;       
06e0: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
06f0: 64 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75  ding block-outpu
0700: 74 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  t return address
0710: 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42   */.  int labelB
0720: 6b 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  kOut;       /* S
0730: 74 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74  tart label for t
0740: 68 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20  he block-output 
0750: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
0760: 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65  int addrSortInde
0770: 78 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  x;    /* Address
0780: 20 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65   of the OP_Sorte
0790: 72 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e  rOpen or OP_Open
07a0: 45 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 75  Ephemeral */.  u
07b0: 38 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20  8 sortFlags;    
07c0: 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
07d0: 6d 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20  more SORTFLAG_* 
07e0: 62 69 74 73 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69  bits */.};.#defi
07f0: 6e 65 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  ne SORTFLAG_UseS
0800: 6f 72 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a  orter  0x01   /*
0810: 20 55 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20   Use SorterOpen 
0820: 69 6e 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45  instead of OpenE
0830: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a  phemeral */../*.
0840: 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68  ** Delete all th
0850: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53  e content of a S
0860: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 2e  elect structure.
0870: 20 20 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Deallocate the
0880: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74   structure.** it
0890: 73 65 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72  self only if bFr
08a0: 65 65 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ee is true..*/.s
08b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
08c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
08d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
08e0: 6e 74 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69  nt bFree){.  whi
08f0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c  le( p ){.    Sel
0900: 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
0910: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c  >pPrior;.    sql
0920: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
0930: 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  te(db, p->pEList
0940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  );.    sqlite3Sr
0950: 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
0960: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71  p->pSrc);.    sq
0970: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0980: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a  db, p->pWhere);.
0990: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
09a0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
09b0: 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
09c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
09d0: 65 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  e(db, p->pHaving
09e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
09f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
0a00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
0a10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a20: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
0a30: 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
0a40: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
0a50: 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  ->pOffset);.    
0a60: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
0a70: 65 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  e(db, p->pWith);
0a80: 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29  .    if( bFree )
0a90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0aa0: 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70  b, p);.    p = p
0ab0: 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65 65  Prior;.    bFree
0ac0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
0ad0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0ae0: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0af0: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0b00: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0b10: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0b20: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0b30: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0b40: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
0b50: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
0b60: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
0b70: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
0b80: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
0b90: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
0ba0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0bb0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0bc0: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0bd0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0be0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0bf0: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0c00: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0c10: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0c20: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0c30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0c40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
0c50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
0c60: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
0c70: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
0c80: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
0c90: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0ca0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0cb0: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0cc0: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0cd0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0ce0: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0cf0: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0d00: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0d10: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0d20: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0d30: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0d40: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
0d60: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
0d70: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
0d80: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
0d90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0da0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0db0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0dc0: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0dd0: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0de0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0df0: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0e00: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0e10: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0e30: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0e40: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0e50: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0e60: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
0e70: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
0e80: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
0e90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
0ea0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0eb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0ec0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0ed0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
0ee0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ew==0 ){.    ass
0ef0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0f00: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65  ailed );.    pNe
0f10: 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20  w = &standin;.  
0f20: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
0f30: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
0f40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69  ;.  }.  if( pELi
0f50: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c  st==0 ){.    pEL
0f60: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
0f70: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
0f80: 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
0f90: 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29  pr(db,TK_ALL,0))
0fa0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45  ;.  }.  pNew->pE
0fb0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
0fc0: 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70   if( pSrc==0 ) p
0fd0: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Src = sqlite3DbM
0fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0ff0: 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20  zeof(*pSrc));.  
1000: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72  pNew->pSrc = pSr
1010: 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72  c;.  pNew->pWher
1020: 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e  e = pWhere;.  pN
1030: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70  ew->pGroupBy = p
1040: 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d  GroupBy;.  pNew-
1050: 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69  >pHaving = pHavi
1060: 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  ng;.  pNew->pOrd
1070: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1080: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
1090: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
10a0: 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45  pNew->op = TK_SE
10b0: 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  LECT;.  pNew->pL
10c0: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10d0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
10e0: 20 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65   pOffset;.  asse
10f0: 72 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c  rt( pOffset==0 |
1100: 7c 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70  | pLimit!=0 || p
1110: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c  Parse->nErr>0 ||
1120: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1130: 64 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  d!=0 );.  pNew->
1140: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
1150: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
1160: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
1170: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
1180: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
1190: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64     clearSelect(d
11a0: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
11b0: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
11c0: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
11d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
11e0: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
11f0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1200: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
1210: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
1220: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1230: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
1240: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
1250: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
1260: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1270: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1280: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1290: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
12a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
12b0: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
12c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12d0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
12e0: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
12f0: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1300: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
1310: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
1320: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
1330: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
1340: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
1350: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
1360: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1370: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1380: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1390: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
13a0: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
13b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
13c0: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
13d0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
13e0: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
13f0: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1400: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1410: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1420: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1430: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
1440: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1450: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
1460: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
1470: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
1480: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
1490: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
14a0: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
14b0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
14c0: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
14d0: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
14e0: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
14f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1500: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1510: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1520: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1530: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
1540: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
1550: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
1560: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
1570: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
1580: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
1590: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
15a0: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
15b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
15c0: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
15d0: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
15e0: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
15f0: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1600: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1610: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1620: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1630: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1640: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
1650: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1660: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
1670: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
1680: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
1690: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
16a0: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
16d0: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
16e0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
16f0: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1700: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1710: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1720: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1730: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
1740: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
1750: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
1760: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
1770: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
1780: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
1790: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
17a0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
17b0: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
17c0: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
17d0: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
17e0: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
17f0: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1800: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1810: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1820: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1840: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
1850: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
1860: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
1870: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
1880: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
1890: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
18b0: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
18c0: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
18d0: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
18e0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
18f0: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1900: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1910: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1920: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1930: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1940: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1950: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1960: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1970: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1980: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1990: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
19a0: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
19b0: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
19c0: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
19d0: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
19e0: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
19f0: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1a00: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1a10: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1a20: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1a30: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1a40: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1a50: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1a60: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1a70: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1a80: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1a90: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1ab0: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1ac0: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ae0: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1af0: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1b00: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1b10: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1b20: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1b30: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1b40: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1b50: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1b60: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b80: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1b90: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1ba0: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1bb0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1bc0: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1bd0: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1be0: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1bf0: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1c00: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1c10: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1c20: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1c30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1c40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1c50: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1c60: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1c70: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1c80: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1c90: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1ca0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1cb0: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1cc0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1cd0: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1ce0: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1cf0: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1d00: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1d20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1d30: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1d40: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1d50: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1d60: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1d70: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1d80: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1d90: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1da0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1db0: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1dc0: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1dd0: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1de0: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1df0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1e00: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1e10: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1e20: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1e30: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1e40: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1e50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1e60: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1e70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1e80: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1e90: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
1ea0: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
1ed0: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
1ee0: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
1ef0: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
1f00: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
1f10: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
1f20: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
1f30: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
1f40: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
1f50: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
1f60: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
1f70: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
1f80: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
1f90: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
1fa0: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
1fb0: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
1fc0: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
1fd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
1fe0: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
1ff0: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2000: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2010: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2020: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2030: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
2050: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
2060: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
2070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2080: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
2090: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
20a0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
20b0: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
20c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
20d0: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
20e0: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
20f0: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2100: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2110: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2120: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2130: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
2140: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2150: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2160: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
2170: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
2180: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
2190: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
21a0: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
21b0: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
21c0: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
21d0: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
21e0: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
21f0: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2200: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2210: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2220: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2230: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
2240: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
2250: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
2260: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
2270: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
2280: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
2290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
22a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22d0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22e0: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
22f0: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2300: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2310: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2320: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2330: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
2340: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
2350: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
2360: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
2370: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
2380: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
2390: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
23a0: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
23b0: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
23c0: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
23d0: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
23e0: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
23f0: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2400: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2410: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2420: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2430: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
2440: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
2450: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
2460: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
2470: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2490: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
24b0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
24c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
24d0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
24e0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
24f0: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2520: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2530: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
2540: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2560: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2570: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
2580: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
25b0: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
25c0: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
25d0: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
25e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25f0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2600: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2610: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2620: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2630: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2640: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
2650: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
2660: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
2670: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2680: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
2690: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
26a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
26c0: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
26d0: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
26e0: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
26f0: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2710: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2730: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
2740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2750: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
2760: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
2770: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
2780: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2790: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
27a0: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
27b0: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
27c0: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
27d0: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
27e0: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
27f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2800: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 2c 20 30  _EQ, pE1, pE2, 0
2810: 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26 20  );.  if( pEq && 
2820: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
2830: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2840: 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a  ty(pEq, EP_FromJ
2850: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2860: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2870: 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e  ty(pEq, EP_Token
2880: 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
2890: 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56   );.    ExprSetV
28a0: 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20  VAProperty(pEq, 
28b0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
28c0: 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69    pEq->iRightJoi
28d0: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70 45  nTable = (i16)pE
28e0: 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  2->iTable;.  }. 
28f0: 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c 69   *ppWhere = sqli
2900: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 2a  te3ExprAnd(db, *
2910: 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d  ppWhere, pEq);.}
2920: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2930: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70  EP_FromJoin prop
2940: 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d  erty on all term
2950: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  s of the given e
2960: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e  xpression..** An
2970: 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69  d set the Expr.i
2980: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74  RightJoinTable t
2990: 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65  o iTable for eve
29a0: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a  ry term in the.*
29b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  * expression..**
29c0: 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a  .** The EP_FromJ
29d0: 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20  oin property is 
29e0: 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66  used on terms of
29f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
2a00: 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45  o tell.** the LE
2a10: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72  FT OUTER JOIN pr
2a20: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74  ocessing logic t
2a30: 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73  hat this term is
2a40: 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
2a50: 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e  join restriction
2a60: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
2a70: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
2a80: 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70  ause and not a p
2a90: 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f  art.** of the mo
2aa0: 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45  re general WHERE
2ab0: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20   clause.  These 
2ac0: 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20  terms are moved 
2ad0: 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57  over to the.** W
2ae0: 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69  HERE clause duri
2af0: 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69  ng join processi
2b00: 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74  ng but we need t
2b10: 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20  o remember that 
2b20: 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74  they.** originat
2b30: 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  ed in the ON or 
2b40: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
2b50: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69  .** The Expr.iRi
2b60: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c  ghtJoinTable tel
2b70: 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ls the WHERE cla
2b80: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  use processing t
2b90: 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  hat the.** expre
2ba0: 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e  ssion depends on
2bb0: 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69   table iRightJoi
2bc0: 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74  nTable even if t
2bd0: 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  hat table is not
2be0: 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d  .** explicitly m
2bf0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2c00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61  expression.  Tha
2c10: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  t information is
2c20: 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63   needed.** for c
2c30: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ases like this:.
2c40: 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2c50: 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
2c60: 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
2c70: 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a  2.b AND t1.x=5.*
2c80: 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63  *.** The where c
2c90: 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64  lause needs to d
2ca0: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2cb0: 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a  g of the t1.x=5.
2cc0: 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66  ** term until af
2cd0: 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20  ter the t2 loop 
2ce0: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e  of the join.  In
2cf0: 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20   that way, a.** 
2d00: 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c  NULL t2 row will
2d10: 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65   be inserted whe
2d20: 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20  never t1.x!=5.  
2d30: 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20  If we do not.** 
2d40: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2d50: 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74  ng of t1.x=5, it
2d60: 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73   will be process
2d70: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  ed immediately.*
2d80: 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c  * after the t1 l
2d90: 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74  oop and rows wit
2da0: 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e  h t1.x!=5 will n
2db0: 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a  ever appear in.*
2dc0: 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68  * the output, wh
2dd0: 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74  ich is incorrect
2de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2df0: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70   setJoinExpr(Exp
2e00: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
2e10: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
2e20: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
2e30: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
2e40: 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74  oin);.    assert
2e50: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2e60: 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ty(p, EP_TokenOn
2e70: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2e80: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41  ;.    ExprSetVVA
2e90: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e  Property(p, EP_N
2ea0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 2d  oReduce);.    p-
2eb0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
2ec0: 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b 0a   = (i16)iTable;.
2ed0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2ee0: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
2ef0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
2f00: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
2f10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f20: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
2f30: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
2f40: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2f50: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2f60: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2f70: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2f80: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2f90: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2fa0: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
2fb0: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
2fc0: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
2fd0: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
2fe0: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
2ff0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
3000: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
3010: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
3020: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
3030: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
3040: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
3050: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
3060: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
3070: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
3080: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
3090: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
30a0: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
30b0: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
30c0: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
30d0: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
30e0: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
30f0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
3100: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
3110: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
3120: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
3130: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3140: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
3150: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
3160: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
3170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3180: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
3190: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
31a0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
31b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
31c0: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
31d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
31e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
31f0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3210: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
3220: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
3230: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3260: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
3270: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
3280: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
3290: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
32a0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
32b0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
32c0: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
32d0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
32e0: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
32f0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
3300: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
3310: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
3320: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
3330: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
3340: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
3350: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
3360: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
3370: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
3380: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
3390: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
33a0: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
33b0: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56  er;..    if( NEV
33c0: 45 52 28 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  ER(pLeftTab==0 |
33d0: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29 20  | pRightTab==0) 
33e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
33f0: 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68  isOuter = (pRigh
3400: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
3410: 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20  _OUTER)!=0;..   
3420: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54   /* When the NAT
3430: 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20  URAL keyword is 
3440: 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45  present, add WHE
3450: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE clause terms 
3460: 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  for.    ** every
3470: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65   column that the
3480: 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65   two tables have
3490: 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20   in common..    
34a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
34b0: 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  t->jointype & JT
34c0: 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20  _NATURAL ){.    
34d0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
34e0: 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73  n || pRight->pUs
34f0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
3500: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3510: 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41  Parse, "a NATURA
3520: 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68  L join may not h
3530: 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  ave ".          
3540: 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47   "an ON or USING
3550: 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20   clause", 0);.  
3560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
3580: 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54  r(j=0; j<pRightT
3590: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
35a0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
35b0: 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame;   /* Name o
35c0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  f column in the 
35d0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
35e0: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
35f0: 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e  ;     /* Matchin
3600: 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  g left table */.
3610: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3620: 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69  tCol;  /* Matchi
3630: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ng column in the
3640: 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a   left table */..
3650: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
3660: 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b  pRightTab->aCol[
3670: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3680: 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43 6f    if( tableAndCo
3690: 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20  lumnIndex(pSrc, 
36a0: 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65  i+1, zName, &iLe
36b0: 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20 29  ft, &iLeftCol) )
36c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57  {.          addW
36d0: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
36e0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c   pSrc, iLeft, iL
36f0: 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a  eftCol, i+1, j,.
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
3720: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
3730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3740: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73     }..    /* Dis
3750: 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e  allow both ON an
3760: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
3770: 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e  in the same join
3780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3790: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70  pRight->pOn && p
37a0: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
37b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
37c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
37d0: 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74 68  cannot have both
37e0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22 0a   ON and USING ".
37f0: 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65 73          "clauses
3800: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
3810: 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
3820: 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n 1;.    }..    
3830: 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63 6c  /* Add the ON cl
3840: 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64 20  ause to the end 
3850: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3860: 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62  use, connected b
3870: 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20  y.    ** an AND 
3880: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f  operator..    */
3890: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
38a0: 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  >pOn ){.      if
38b0: 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74 4a  ( isOuter ) setJ
38c0: 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d 3e  oinExpr(pRight->
38d0: 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43 75  pOn, pRight->iCu
38e0: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rsor);.      p->
38f0: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3900: 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e  ExprAnd(pParse->
3910: 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  db, p->pWhere, p
3920: 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20  Right->pOn);.   
3930: 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d     pRight->pOn =
3940: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
3950: 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20 74  * Create extra t
3960: 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45 52  erms on the WHER
3970: 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61 63  E clause for eac
3980: 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20  h column named. 
3990: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53 49     ** in the USI
39a0: 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61 6d  NG clause.  Exam
39b0: 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f 20  ple: If the two 
39c0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
39d0: 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  ned are .    ** 
39e0: 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65 20  A and B and the 
39f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d  USING clause nam
3a00: 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20  es X, Y, and Z, 
3a10: 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20 20  then add this.  
3a20: 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45 52    ** to the WHER
3a30: 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e 58  E clause:    A.X
3a40: 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59  =B.X AND A.Y=B.Y
3a50: 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20   AND A.Z=B.Z.   
3a60: 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72   ** Report an er
3a70: 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d  ror if any colum
3a80: 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  n mentioned in t
3a90: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3aa0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f  is.    ** not co
3ab0: 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68 20  ntained in both 
3ac0: 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69  tables to be joi
3ad0: 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned..    */.    
3ae0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73 69  if( pRight->pUsi
3af0: 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c 69  ng ){.      IdLi
3b00: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69 67  st *pList = pRig
3b10: 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20  ht->pUsing;.    
3b20: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69    for(j=0; j<pLi
3b30: 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20  st->nId; j++){. 
3b40: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
3b50: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
3b60: 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20 74  of the term in t
3b70: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
3b80: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3b90: 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Left;       /* T
3ba0: 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66 74  able on the left
3bb0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 63   with matching c
3bc0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
3bd0: 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43        int iLeftC
3be0: 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol;    /* Column
3bf0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   number of match
3c00: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68  ing column on th
3c10: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20 20  e left */.      
3c20: 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b    int iRightCol;
3c30: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
3c40: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3c50: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69  column on the ri
3c60: 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ght */..        
3c70: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
3c80: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3c90: 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20 63     iRightCol = c
3ca0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
3cb0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  tTab, zName);.  
3cc0: 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68 74        if( iRight
3cd0: 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20 7c  Col<0.         |
3ce0: 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  | !tableAndColum
3cf0: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3d00: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
3d10: 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20   &iLeftCol).    
3d20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
3d30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3d40: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3d50: 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75   join using colu
3d60: 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22  mn %s - column "
3d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f  .            "no
3d80: 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74  t present in bot
3d90: 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65  h tables", zName
3da0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
3db0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
3dc0: 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72  .        addWher
3dd0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
3de0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
3df0: 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68 74  Col, i+1, iRight
3e00: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
3e10: 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74 65            isOute
3e20: 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a  r, &p->pWhere);.
3e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3e40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3e50: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
3e60: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
3e70: 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f  KeyInfo *keyInfo
3e80: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
3e90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3ea0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
3eb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3ec0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
3ed0: 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65    /* Form the Ke
3ee0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f  yInfo object fro
3ef0: 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74 20  m this ExprList 
3f00: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c  */.  int iStart,
3f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
3f20: 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c  in with this col
3f30: 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a  umn of pList */.
3f40: 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20    int nExtra    
3f50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3f60: 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f  is many extra co
3f70: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64  lumns to the end
3f80: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65   */.);../*.** Ge
3f90: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
3fa0: 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72   will push the r
3fb0: 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65  ecord in registe
3fc0: 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68  rs regData.** th
3fd0: 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44  rough regData+nD
3fe0: 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73  ata-1 onto the s
3ff0: 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  orter..*/.static
4000: 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f   void pushOntoSo
4010: 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rter(.  Parse *p
4020: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
4030: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
4040: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
4050: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  Sort,        /* 
4060: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
4070: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  t the ORDER BY c
4080: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
4090: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
40a0: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
40b0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
40c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
40d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
40e0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
40f0: 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65  lding data to be
4100: 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74   sorted */.  int
4110: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
4120: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4130: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
4140: 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a 20   data array */. 
4150: 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20   int nPrefixReg 
4160: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
4170: 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20 72  f reg prior to r
4180: 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c 65  egData available
4190: 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a 20   for use */.){. 
41a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
41b0: 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20  e->pVdbe;       
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72 20    /* Stmt under 
41e0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
41f0: 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28 70    int bSeq = ((p
4200: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
4210: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
4220: 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e 74  rter)==0);.  int
4230: 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d 3e   nExpr = pSort->
4240: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4260: 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42 59   No. of ORDER BY
4270: 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20   terms */.  int 
4280: 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b 20  nBase = nExpr + 
4290: 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20 20  bSeq + nData;   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42b0: 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65 72  Fields in sorter
42c0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
42d0: 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65 72   Regs for sorter
4310: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
4320: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b 70   regRecord = ++p
4330: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4350: 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74 65   Assembled sorte
4360: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4370: 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72 74  t nOBSat = pSort
4380: 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  ->nOBSat;       
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43a0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  * ORDER BY terms
43b0: 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69 6e   to skip */.  in
43c0: 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61 64   /* Opcode to ad
43f0: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
4400: 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20  to sorter */..  
4410: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4420: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
4430: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29  if( nPrefixReg )
4440: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
4450: 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b  refixReg==nExpr+
4460: 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42  bSeq );.    regB
4470: 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20  ase = regData - 
4480: 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20  nExpr - bSeq;.  
4490: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
44a0: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
44b0: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
44c0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
44d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
44e0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
44f0: 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70  pParse, pSort->p
4500: 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65  OrderBy, regBase
4510: 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
4520: 50 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29  P);.  if( bSeq )
4530: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
4540: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
4550: 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69  quence, pSort->i
4560: 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65  ECursor, regBase
4570: 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69  +nExpr);.  }.  i
4580: 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30  f( nPrefixReg==0
4590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
45a0: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
45b0: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
45c0: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
45d0: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20   nData);.  }..  
45e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
45f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
4600: 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53  rd, regBase+nOBS
4610: 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74  at, nBase-nOBSat
4620: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
4630: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
4640: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
4650: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
4660: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
4670: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
4680: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
4690: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
46a0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
46b0: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
46c0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
46d0: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
46e0: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
46f0: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
4700: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
4710: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
4720: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
4730: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
4740: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
4750: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
4760: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
4770: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
4780: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
4790: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
47a0: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
47b0: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
47c0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
47d0: 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73  gPrevKey = pPars
47e0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
47f0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
4800: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20  Sort->nOBSat;.  
4810: 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d    nKey = nExpr -
4820: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b   pSort->nOBSat +
4830: 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62   bSeq;.    if( b
4840: 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Seq ){.      add
4850: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4860: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4870: 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b  _IfNot, regBase+
4880: 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c  nExpr); .    }el
4890: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69  se{.      addrFi
48a0: 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rst = sqlite3Vdb
48b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65  eAddOp1(v, OP_Se
48c0: 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72  quenceTest, pSor
48d0: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
48e0: 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65    }.    VdbeCove
48f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
4900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4910: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
4920: 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73  gPrevKey, regBas
4930: 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  e, pSort->nOBSat
4940: 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  );.    pOp = sql
4950: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
4960: 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74   pSort->addrSort
4970: 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
4980: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
4990: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
49a0: 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  n;.    pOp->p2 =
49b0: 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20   nKey + nData;. 
49c0: 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34     pKI = pOp->p4
49d0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d  .pKeyInfo;.    m
49e0: 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74  emset(pKI->aSort
49f0: 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e  Order, 0, pKI->n
4a00: 46 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73  Field); /* Makes
4a10: 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74   OP_Jump below t
4a20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4a30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4a40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4a50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4a70: 20 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20   pKI->nXField>2 
4a80: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
4a90: 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
4aa0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
4ab0: 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72  arse, pSort->pOr
4ac0: 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20  derBy, nOBSat,. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e            pKI->n
4b00: 58 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  XField-1);.    a
4b10: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
4b20: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4b30: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4b40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4b50: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
4b60: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
4b70: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
4b80: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
4b90: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
4ba0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
4bb0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
4bc0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
4bd0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
4be0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
4bf0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
4c00: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
4c10: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
4c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
4c30: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
4c40: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
4c50: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4c60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4c70: 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73  Here(v, addrFirs
4c80: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4c90: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4ca0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67  se, regBase, reg
4cb0: 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e  PrevKey, pSort->
4cc0: 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c  nOBSat);.    sql
4cd0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
4ce0: 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20  (v, addrJmp);.  
4cf0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
4d00: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
4d10: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
4d20: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
4d30: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
4d40: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
4d50: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
4d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d70: 70 32 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d  p2(v, op, pSort-
4d80: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
4d90: 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53 65  cord);.  if( pSe
4da0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
4db0: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
4dc0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
4dd0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
4de0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
4df0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
4e00: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
4e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
4e20: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
4e30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
4e40: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
4e50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
4e60: 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d  _IfNotZero, iLim
4e70: 69 74 2c 20 30 2c 20 2d 31 29 3b 20 56 64 62 65  it, 0, -1); Vdbe
4e80: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4ea0: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
4eb0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4ed0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
4ee0: 65 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  ete, pSort->iECu
4ef0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
4f00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
4f10: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
4f20: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
4f30: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
4f40: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
4f50: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
4f60: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
4f70: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
4f80: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
4f90: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
4fa0: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
4fb0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
4fc0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
4fd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
4fe0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
4ff0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
5000: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5010: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5020: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e  fset>0 ){.    in
5030: 74 20 61 64 64 72 3b 0a 20 20 20 20 61 64 64 72  t addr;.    addr
5040: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5050: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 65 67  dOp3(v, OP_IfNeg
5060: 2c 20 69 4f 66 66 73 65 74 2c 20 30 2c 20 2d 31  , iOffset, 0, -1
5070: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
5080: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5090: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
50a0: 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e  Goto, 0, iContin
50b0: 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  ue);.    VdbeCom
50c0: 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f  ment((v, "skip O
50d0: 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29  FFSET records"))
50e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
50f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
5100: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5110: 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77   Add code that w
5120: 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ill check to mak
5130: 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67  e sure the N reg
5140: 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
5150: 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20  at iMem.** form 
5160: 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79  a distinct entry
5170: 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72  .  iTab is a sor
5180: 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
5190: 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79  holds previously
51a0: 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61  .** seen combina
51b0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76  tions of the N v
51c0: 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e  alues.  A new en
51d0: 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69  try is made in i
51e0: 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75  Tab.** if the cu
51f0: 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61  rrent N values a
5200: 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20  re new..**.** A 
5210: 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65  jump to addrRepe
5220: 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74  at is made and t
5230: 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72  he N+1 values ar
5240: 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
5250: 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68  e.** stack if th
5260: 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73  e top N elements
5270: 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63   are not distinc
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a  d codeDistinct(.
52a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
52b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
52c0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
52d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
52e0: 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20   int iTab,      
52f0: 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67      /* A sorting
5300: 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74   index used to t
5310: 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74  est for distinct
5320: 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ness */.  int ad
5330: 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20  drRepeat,    /* 
5340: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20  Jump to here if 
5350: 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  not distinct */.
5360: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
5370: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5380: 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  f elements */.  
5390: 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20  int iMem        
53a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d     /* First elem
53b0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
53c0: 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a   *v;.  int r1;..
53d0: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
53e0: 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69  dbe;.  r1 = sqli
53f0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5400: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
5410: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5420: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
5430: 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65   addrRepeat, iMe
5440: 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72  m, N); VdbeCover
5450: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
5460: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5470: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
5480: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
5490: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
54a0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
54b0: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
54c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
54d0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
54e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
54f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5500: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
5510: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5520: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
5530: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
5540: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
5550: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
5560: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
5570: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
5580: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
5590: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
55a0: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
55b0: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
55c0: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
55d0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
55e0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
55f0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
5600: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
5610: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
5620: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
5630: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5640: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
5650: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
5660: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
5670: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
5680: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
5690: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
56a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
56b0: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
56c0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
56d0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
56e0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
56f0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
5700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5710: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
5720: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
5730: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
5740: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
5750: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
5760: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
5770: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
5780: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
5790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
57a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
57b0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
57c0: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
57d0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
57e0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
57f0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
5800: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
5810: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
5830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
5840: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
5850: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
5860: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
5870: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
5880: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
5890: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
58a0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
58b0: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
58c0: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
58d0: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
58e0: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
58f0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
5900: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
5910: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
5920: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
5930: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
5940: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
5950: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
5960: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
5970: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
5980: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5990: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
59a0: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
59b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
59c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
59d0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
59e0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
59f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5a00: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5a10: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5a20: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5a30: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5a40: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5a50: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5a60: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5a70: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5a80: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5a90: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5aa0: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5ab0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5ac0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5ad0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5ae0: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5af0: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5b00: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5b10: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5b20: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5b30: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5b40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5b50: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5b60: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5b70: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5b80: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5ba0: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
5bb0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
5bc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5be0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
5bf0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
5c00: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
5c10: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5c20: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
5c30: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
5c40: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
5c50: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
5c60: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
5c70: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
5c80: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
5c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
5ca0: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
5cb0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
5cc0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
5cd0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
5ce0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
5cf0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
5d00: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
5d10: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
5d20: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
5d30: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
5d40: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
5d50: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
5d60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5d70: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
5d80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
5d90: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
5da0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
5db0: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
5dc0: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
5dd0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
5de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
5df0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
5e00: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
5e10: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
5e20: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
5e30: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
5e40: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
5e50: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
5e60: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
5e70: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
5e80: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
5e90: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
5ea0: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
5eb0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
5ec0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
5ed0: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
5ee0: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
5ef0: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
5f00: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
5f10: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
5f20: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
5f30: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
5f40: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
5f50: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
5f60: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
5f70: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
5f80: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
5f90: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
5fa0: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
5fb0: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
5fc0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
5fd0: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
5fe0: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
5ff0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
6000: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
6010: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
6020: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
6030: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
6040: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
6050: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
6060: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
6070: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
6080: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
6090: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
60a0: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
60b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
60c0: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
60d0: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
60e0: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
60f0: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
6100: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
6110: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
6120: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
6130: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
6140: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
6150: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
6160: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
6170: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
6180: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
6190: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
61a0: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
61b0: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
61c0: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
61d0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
61e0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
61f0: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
6200: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
6210: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
6220: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
6230: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
6240: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
6250: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
6260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6270: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6280: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
6290: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
62a0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
62b0: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
62c0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
62d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
62e0: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
62f0: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
6300: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
6310: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
6320: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
6330: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
6340: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
6350: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
6360: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
6370: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
6380: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
6390: 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
63a0: 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 0a 20  st, regResult,. 
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
63d0: 70 75 74 7c 7c 65 44 65 73 74 3d 3d 53 52 54 5f  put||eDest==SRT_
63e0: 43 6f 72 6f 75 74 69 6e 65 29 3f 53 51 4c 49 54  Coroutine)?SQLIT
63f0: 45 5f 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20  E_ECEL_DUP:0);. 
6400: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
6410: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
6420: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
6430: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6440: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
6450: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
6460: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
6470: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
6480: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
6490: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
64a0: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
64b0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77  stinct ){.    sw
64c0: 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d  itch( pDistinct-
64d0: 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20  >eTnctType ){.  
64e0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
64f0: 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a  ISTINCT_ORDERED:
6500: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f   {.        VdbeO
6510: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20  p *pOp;         
6520: 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20     /* No longer 
6530: 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68  required OpenEph
6540: 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f  emeral instr. */
6550: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75  .        int iJu
6560: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
6570: 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61   /* Jump destina
6580: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
6590: 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
65a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
65b0: 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20  ous row content 
65c0: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  */..        /* A
65d0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
65e0: 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  r the previous r
65f0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ow */.        re
6600: 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e  gPrev = pParse->
6610: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
6620: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6630: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20  nResultCol;..   
6640: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
6650: 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
6660: 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65  ral coded earlie
6670: 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a  r to an OP_Null.
6680: 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20          ** sets 
6690: 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20  the MEM_Cleared 
66a0: 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74  bit on the first
66b0: 20 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65   register of the
66c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
66d0: 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69  ious value.  Thi
66e0: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
66f0: 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20   OP_Ne below to 
6700: 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a  always.        *
6710: 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69  * fail on the fi
6720: 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
6730: 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69   the loop even i
6740: 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  f the first.    
6750: 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c      ** row is al
6760: 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20  l NULLs..       
6770: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
6780: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
6790: 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74  oop(v, pDistinct
67a0: 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20  ->addrTnct);.   
67b0: 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74       pOp = sqlit
67c0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
67d0: 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e  Distinct->addrTn
67e0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ct);.        pOp
67f0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75  ->opcode = OP_Nu
6800: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  ll;.        pOp-
6810: 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  >p1 = 1;.       
6820: 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72   pOp->p2 = regPr
6830: 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75  ev;..        iJu
6840: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
6850: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
6860: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
6870: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6880: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
6890: 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  {.          Coll
68a0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
68b0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
68c0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
68d0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
68e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
68f0: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
6900: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6910: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6920: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
6930: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
6940: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
6950: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6960: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
6970: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
6980: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6990: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
69a0: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
69b0: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
69c0: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
69d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
69e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
69f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6a00: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
6a10: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
6a20: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
6a30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6a40: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
6a50: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
6a60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a70: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
6a80: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6a90: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
6aa0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
6ab0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
6ac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6ad0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
6ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
6af0: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
6b00: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
6b10: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
6b20: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6b30: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
6b40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6b50: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6b60: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
6b70: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
6b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6b90: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
6ba0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6bb0: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
6bc0: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
6bd0: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
6be0: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
6bf0: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
6c00: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
6c10: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
6c20: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65 67 52  nResultCol, regR
6c30: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6c50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f     }.    if( pSo
6c60: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  rt==0 ){.      c
6c70: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
6c80: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
6c90: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
6ca0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
6cb0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
6cc0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
6cd0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
6ce0: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
6cf0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
6d00: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
6d10: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
6d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6d30: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
6d40: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
6d50: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
6d60: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
6d70: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6d80: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
6d90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6da0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
6db0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6dc0: 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20  tCol, r1);.     
6dd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6de0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6df0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6e10: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6e20: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
6e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6e40: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
6e50: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
6e60: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
6e70: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
6e80: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
6e90: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
6ea0: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
6eb0: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
6ec0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
6ed0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
6ee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6ef0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
6f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6f10: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
6f20: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
6f30: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
6f40: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
6f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6f60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6f70: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
6f80: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
6f90: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
6fa0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
6fb0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
6fc0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66      case SRT_Fif
6fd0: 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  o:.    case SRT_
6fe0: 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61  DistFifo:.    ca
6ff0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
7000: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
7010: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
7020: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
7030: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7040: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
7050: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7060: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
7070: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
7080: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
7090: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
70a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
70b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
70c0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
70d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
70e0: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
70f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7100: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
7110: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
7120: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
7130: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
7140: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
7150: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
7160: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
7170: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
7180: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
7190: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
71a0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
71b0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
71c0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
71d0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
71e0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
71f0: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
7200: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
7210: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
7220: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
7230: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
7240: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
7250: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
7260: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
7270: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
7280: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
7290: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
72a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
72b0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
72c0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
72d0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 20 56 64  addr, r1, 0); Vd
72e0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
72f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7300: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7310: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b  dxInsert, iParm+
7320: 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  1, r1);.        
7330: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
7340: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
7350: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
7360: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  rt ){.        pu
7370: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
7380: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
7390: 31 2b 6e 50 72 65 66 69 78 52 65 67 2c 20 31 2c  1+nPrefixReg, 1,
73a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
73b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73c0: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
73d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
73e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
73f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7400: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7410: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
7420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7430: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
7440: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
7450: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7460: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7470: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7480: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
7490: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
74a0: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
74b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
74c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
74d0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
74e0: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
74f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7500: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
7510: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7520: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
7530: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
7540: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
7550: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
7560: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
7570: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
7580: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
7590: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
75a0: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
75b0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
75c0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
75d0: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
75e0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
75f0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
7600: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
7610: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44  l==1 );.      pD
7620: 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20  est->affSdst =. 
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
7650: 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e  ffinity(pEList->
7660: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
7670: 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
7680: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
7690: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69          /* At fi
76a0: 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77  rst glance you w
76b0: 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f  ould think we co
76c0: 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74  uld optimize out
76d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
76e0: 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73  ORDER BY in this
76f0: 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20   case since the 
7700: 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73  order of entries
7710: 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20   in the set.    
7720: 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
7730: 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65  matter.  But the
7740: 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49  re might be a LI
7750: 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77  MIT clause, in w
7760: 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
7770: 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64  case the order d
7780: 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20  oes matter */.  
7790: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
77a0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
77b0: 72 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  rt, p, regResult
77c0: 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65 67 29  , 1, nPrefixReg)
77d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
77e0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
77f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7800: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7820: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
7830: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
7840: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
7850: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
7860: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7870: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
7880: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
7890: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
78a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
78b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
78c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
78d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
78e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
78f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
7900: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7910: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
7920: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
7930: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7940: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
7950: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
7960: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7970: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
7980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7990: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
79a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
79b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
79c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
79d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
79e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
79f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7a00: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
7a10: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
7a20: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
7a30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
7a40: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
7a50: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
7a60: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
7a70: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
7a80: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
7a90: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
7aa0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
7ab0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
7ac0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
7ad0: 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  sultCol==1 );.  
7ae0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7af0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7b00: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7b10: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7b20: 75 6c 74 2c 20 31 2c 20 6e 50 72 65 66 69 78 52  ult, 1, nPrefixR
7b30: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
7b40: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7b50: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
7b60: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
7b70: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
7b80: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
7b90: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
7ba0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
7bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7bc0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
7bd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
7be0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
7bf0: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
7c00: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
7c10: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
7c20: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
7c30: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
7c40: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7c50: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
7c60: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7c70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
7c80: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
7c90: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7ca0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
7cb0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7cc0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7cd0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7ce0: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
7cf0: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
7d00: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
7d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
7d20: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
7d30: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
7d40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7d50: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
7d60: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
7d70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d90: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
7da0: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
7db0: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7dd0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
7de0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
7df0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7e00: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
7e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7e30: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
7e40: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
7e50: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
7e60: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
7e70: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
7e80: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
7e90: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
7ea0: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
7eb0: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
7ec0: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
7ed0: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
7ee0: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
7ef0: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
7f00: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
7f10: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
7f20: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
7f30: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
7f40: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
7f50: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
7f60: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
7f70: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
7f80: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
7f90: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
7fa0: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
7fb0: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
7fc0: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
7fd0: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
7fe0: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
7ff0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8000: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8010: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8020: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8030: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8040: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8050: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8060: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8070: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8080: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8090: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
80a0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
80b0: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
80c0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
80d0: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
80e0: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
80f0: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8100: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8110: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8120: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8130: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8140: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8150: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8160: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8170: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8180: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8190: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
81a0: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
81b0: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
81c0: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
81d0: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
81e0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
81f0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8200: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8210: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8240: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8250: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8260: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8270: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8280: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8290: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
82a0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
82b0: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
82c0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
82d0: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
82e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8300: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8310: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8320: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8330: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8340: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8350: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8360: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8380: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8390: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
83c0: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
83d0: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8400: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8420: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8430: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8450: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8460: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8470: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
8480: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8490: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
84a0: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
84b0: 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74      if( addrTest
84c0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
84d0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65  mpHere(v, addrTe
84e0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
84f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
8500: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
8520: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
8530: 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b  se, r2, nKey+2);
8540: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8550: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
8560: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
8570: 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
8580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
8590: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
85a0: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
85b0: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
85c0: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
85d0: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
85e0: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
85f0: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
8600: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
8610: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
8620: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
8630: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
8640: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
8650: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
8660: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
8670: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
8680: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
8690: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
86a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
86b0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
86c0: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
86d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
86e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
86f0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
8700: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
8710: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
8720: 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65  s reached.  Exce
8730: 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72  pt, if.  ** ther
8740: 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69  e is a sorter, i
8750: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
8760: 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65   sorter has alre
8770: 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a  ady limited.  **
8780: 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20   the output for 
8790: 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  us..  */.  if( p
87a0: 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  Sort==0 && p->iL
87b0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
87c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
87d0: 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
87e0: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
87f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
8800: 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ge(v);.  }.}../*
8810: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b  .** Allocate a K
8820: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75  eyInfo object su
8830: 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20  fficient for an 
8840: 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63  index of N key c
8850: 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20  olumns and.** X 
8860: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  extra columns..*
8870: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
8880: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73  e3KeyInfoAlloc(s
8890: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
88a0: 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79  N, int X){.  Key
88b0: 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65  Info *p = sqlite
88c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c  3DbMallocZero(0,
88d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
88e0: 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49       sizeof(KeyI
88f0: 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69  nfo) + (N+X)*(si
8900: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
8910: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
8920: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
8930: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
8940: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
8950: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a  Field = (u16)N;.
8960: 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d      p->nXField =
8970: 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e   (u16)X;.    p->
8980: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
8990: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
89a0: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
89b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
89c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
89d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
89e0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  p;.}../*.** Deal
89f0: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
8a00: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
8a10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
8a20: 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ref(KeyInfo *p){
8a30: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
8a40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
8a50: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
8a60: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
8a70: 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Ref==0 ) sqlite3
8a80: 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20  DbFree(0, p);.  
8a90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
8aa0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f  a new pointer to
8ab0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
8ac0: 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  t.*/.KeyInfo *sq
8ad0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
8ae0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
8af0: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
8b00: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
8b10: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
8b20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
8b30: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8b40: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
8b50: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65  urn TRUE if a Ke
8b60: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e  yInfo object can
8b70: 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65   be change.  The
8b80: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
8b90: 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63  ** can only be c
8ba0: 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69  hanged if this i
8bb0: 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
8bc0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
8bd0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
8be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
8bf0: 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20  sed only inside 
8c00: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
8c10: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
8c20: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
8c30: 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f  riteable(KeyInfo
8c40: 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e   *p){ return p->
8c50: 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69  nRef==1; }.#endi
8c60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
8c70: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  G */../*.** Give
8c80: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
8c90: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
8ca0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
8cb0: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
8cc0: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
8cd0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
8ce0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
8cf0: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
8d00: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
8d10: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
8d20: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
8d30: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
8d40: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
8d50: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
8d60: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
8d70: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
8d80: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
8d90: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
8da0: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
8db0: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
8dc0: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
8dd0: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
8de0: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
8df0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
8e00: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
8e10: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
8e20: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
8e30: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
8e40: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
8e50: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
8e60: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
8e70: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
8e80: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
8e90: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
8ea0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
8eb0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
8ec0: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
8ed0: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
8ee0: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
8ef0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
8f00: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
8f10: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
8f20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8f30: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8f40: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
8f50: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
8f60: 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49  /* Form the KeyI
8f70: 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  nfo object from 
8f80: 74 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f  this ExprList */
8f90: 0a 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20  .  int iStart,  
8fa0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
8fb0: 20 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d   with this colum
8fc0: 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20  n of pList */.  
8fd0: 69 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20  int nExtra      
8fe0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
8ff0: 20 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75   many extra colu
9000: 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  mns to the end *
9010: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  /.){.  int nExpr
9020: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
9030: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
9040: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9050: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
9060: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9070: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
9080: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
9090: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
90a0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
90b0: 62 2c 20 6e 45 78 70 72 2d 69 53 74 61 72 74 2c  b, nExpr-iStart,
90c0: 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20 20 69 66   nExtra+1);.  if
90d0: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
90e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
90f0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
9100: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
9110: 6f 72 28 69 3d 69 53 74 61 72 74 2c 20 70 49 74  or(i=iStart, pIt
9120: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69 53 74 61  em=pList->a+iSta
9130: 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  rt; i<nExpr; i++
9140: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9150: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9160: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
9170: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
9180: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
9190: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
91a0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
91b0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
91c0: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
91d0: 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d  >aColl[i-iStart]
91e0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
91f0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
9200: 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49  r[i-iStart] = pI
9210: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
9220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9230: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66  rn pInfo;.}..#if
9240: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9250: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
9260: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9270: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9280: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9290: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
92a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
92b0: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
92c0: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
92d0: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
92e0: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
92f0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
9300: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
9310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9320: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
9330: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
9340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9350: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
9360: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9380: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9390: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
93a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
93b0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
93c0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
93d0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
93e0: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
93f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9400: 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  AIN./*.** Unless
9410: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
9420: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
9430: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
9440: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
9450: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
9460: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
9470: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
9480: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
9490: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
94a0: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
94b0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
94c0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45  rm:.**.**   "USE
94d0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
94e0: 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72   xxx".**.** wher
94f0: 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20  e xxx is one of 
9500: 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44  "DISTINCT", "ORD
9510: 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50  ER BY" or "GROUP
9520: 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68   BY". Exactly wh
9530: 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d  ich.** is determ
9540: 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61  ined by the zUsa
9550: 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ge argument..*/.
9560: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
9570: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72  ainTempTable(Par
9580: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9590: 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b  t char *zUsage){
95a0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
95b0: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
95c0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
95d0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
95e0: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
95f0: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
9600: 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20  ->db, "USE TEMP 
9610: 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20  B-TREE FOR %s", 
9620: 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  zUsage);.    sql
9630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
9640: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
9650: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
9660: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
9670: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
9680: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
9690: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
96a0: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
96b0: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
96c0: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
96d0: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
96e0: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
96f0: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
9700: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
9710: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
9720: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
9730: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
9740: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
9750: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
9760: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
9770: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
9780: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
9790: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
97a0: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
97b0: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
97c0: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
97d0: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
97e0: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
97f0: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
9800: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
9810: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
9820: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
9830: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
9840: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
9850: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
9860: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
9870: 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64  nteger(y,z).#end
9880: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
9890: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
98a0: 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65  LAIN) && !define
98b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
98c0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f  MPOUND_SELECT)./
98d0: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
98e0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
98f0: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
9900: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
9910: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
9920: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
9930: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
9940: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
9950: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
9960: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
9970: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
9980: 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
9990: 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  two forms:.**.**
99a0: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
99b0: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
99c0: 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a  nd iSub2 (op)".*
99d0: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
99e0: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
99f0: 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20  and iSub2 USING 
9a00: 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29  TEMP B-TREE (op)
9a10: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53  ".**.** where iS
9a20: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72  ub1 and iSub2 ar
9a30: 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70  e the integers p
9a40: 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72  assed as the cor
9a50: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75  responding.** fu
9a60: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
9a70: 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65  s, and op is the
9a80: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
9a90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61  tion of the para
9aa0: 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
9ab0: 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70  same name. The p
9ac0: 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75  arameter "op" mu
9ad0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f  st be one of TK_
9ae0: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
9af0: 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43  ,.** TK_INTERSEC
9b00: 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65  T or TK_ALL. The
9b10: 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75   first form is u
9b20: 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20  sed if argument 
9b30: 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66  bUseTmp is .** f
9b40: 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63  alse, or the sec
9b50: 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69  ond form if it i
9b60: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
9b70: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f  c void explainCo
9b80: 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65  mposite(.  Parse
9b90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
9bb0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
9bc0: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e   /* One of TK_UN
9bf0: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65  ION, TK_EXCEPT e
9c00: 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  tc. */.  int iSu
9c10: 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b1,             
9c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
9c30: 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69  uery id 1 */.  i
9c40: 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20  nt iSub2,       
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c60: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20  * Subquery id 2 
9c70: 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70  */.  int bUseTmp
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
9ca0: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73  a temp table was
9cb0: 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73   used */.){.  as
9cc0: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49  sert( op==TK_UNI
9cd0: 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43  ON || op==TK_EXC
9ce0: 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
9cf0: 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54  TERSECT || op==T
9d00: 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70  K_ALL );.  if( p
9d10: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
9d20: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
9d30: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
9d40: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
9d50: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
9d60: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
9d70: 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44  e->db, "COMPOUND
9d80: 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41   SUBQUERIES %d A
9d90: 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69  ND %d %s(%s)", i
9da0: 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20  Sub1, iSub2,.   
9db0: 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53       bUseTmp?"US
9dc0: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
9dd0: 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  ":"", selectOpNa
9de0: 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20  me(op).    );.  
9df0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9e00: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
9e10: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
9e20: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
9e30: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
9e40: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f   }.}.#else./* No
9e50: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
9e60: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
9e70: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
9e80: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
9e90: 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  ne explainCompos
9ea0: 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  ite(v,w,x,y,z).#
9eb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
9ec0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
9ed0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
9ee0: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
9ef0: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
9f00: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
9f10: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
9f20: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
9f30: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
9f40: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
9f50: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
9f60: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
9f70: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
9f80: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
9f90: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
9fa0: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
9fb0: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fd0: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
9fe0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9ff0: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
a010: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
a020: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
a030: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72  atement */.  Sor
a040: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f  tCtx *pSort,   /
a050: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  * Information on
a060: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
a070: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ause */.  int nC
a080: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
a090: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
a0a0: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
a0b0: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
a0c0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
a0d0: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
a0e0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
a0f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a110: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
a120: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
a130: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  */.  int addrBre
a140: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
a150: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
a160: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
a170: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
a180: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
a190: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
a1a0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
a1b0: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
a1c0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
a1d0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61  nt addr;.  int a
a1e0: 64 64 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69  ddrOnce = 0;.  i
a1f0: 6e 74 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c  nt iTab;.  ExprL
a200: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
a210: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b  pSort->pOrderBy;
a220: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
a230: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
a240: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
a250: 2d 3e 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74  ->iSDParm;.  int
a260: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
a270: 65 67 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 6e  egRowid;.  int n
a280: 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72 74  Key;.  int iSort
a290: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
a2a0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
a2b0: 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20   cursor to read 
a2c0: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  from */.  int nS
a2d0: 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20 20  ortData;        
a2e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
a2f0: 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f 20  iling values to 
a300: 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65 72  read from sorter
a310: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
a320: 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20  nt bSeq;        
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a340: 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72  * True if sorter
a350: 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73   record includes
a360: 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 23 69 66   seq. no. */.#if
a370: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a380: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
a390: 54 53 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  TS.  struct Expr
a3a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
a3b0: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
a3c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
a3d0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a3e0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
a3f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a400: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
a410: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
a420: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
a430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a440: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
a450: 30 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  0, addrBreak);. 
a460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a470: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53  solveLabel(v, pS
a480: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
a490: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
a4a0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
a4b0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
a4c0: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
a4d0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
a4e0: 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ){.    regRowid 
a4f0: 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  = 0;.    regRow 
a500: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
a510: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
a520: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65  nColumn;.  }else
a530: 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  {.    regRowid =
a540: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a550: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a560: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
a570: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a580: 65 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74  e);.    nSortDat
a590: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 6e 4b 65  a = 1;.  }.  nKe
a5a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
a5b0: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42  xpr - pSort->nOB
a5c0: 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  Sat;.  if( pSort
a5d0: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
a5e0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
a5f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53   ){.    int regS
a600: 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73  ortOut = ++pPars
a610: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53 6f  e->nMem;.    iSo
a620: 72 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  rtTab = pParse->
a630: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nTab++;.    if( 
a640: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
a650: 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4f  t ){.      addrO
a660: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  nce = sqlite3Cod
a670: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
a680: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a690: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a6a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a6b0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
a6c0: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
a6d0: 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74  ut, nKey+1+nSort
a6e0: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61  Data);.    if( a
a6f0: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
a700: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a710: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
a720: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
a730: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a740: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
a750: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
a760: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
a770: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
a780: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
a790: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
a7a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a7b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
a7c0: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
a7d0: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f   regSortOut, iSo
a7e0: 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71  rtTab);.    bSeq
a7f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a800: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
a810: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a820: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
a830: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
a840: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a850: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
a860: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
a870: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
a880: 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b  iSortTab = iTab;
a890: 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20  .    bSeq = 1;. 
a8a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
a8b0: 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b  nSortData; i++){
a8c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a8d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a8e0: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 6e  umn, iSortTab, n
a8f0: 4b 65 79 2b 62 53 65 71 2b 69 2c 20 72 65 67 52  Key+bSeq+i, regR
a900: 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43  ow+i);.    VdbeC
a910: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
a920: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
a930: 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61   ? aOutEx[i].zNa
a940: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
a950: 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77  Span));.  }.  sw
a960: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
a970: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
a980: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
a990: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
a9a0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
a9b0: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
a9c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a9d0: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
a9e0: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
a9f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa00: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
aa10: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
aa20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
aa40: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
aa50: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
aa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa70: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
aa80: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
aa90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aaa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aab0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
aac0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
aad0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
aae0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
aaf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab00: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
ab10: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
ab20: 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  1, regRowid,.   
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66       &pDest->aff
ab50: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
ab60: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ab70: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
ab80: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
ab90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
aba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
abb0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
abc0: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
abd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abe0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
abf0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
ac00: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
ac10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ac20: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
ac30: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
ac40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
ac50: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
ac60: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
ac70: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
ac80: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
ac90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
aca0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
acb0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
acc0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
acd0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
ace0: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
acf0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
ad00: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
ad10: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
ad20: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
ad30: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
ad40: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
ad50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ad60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ad70: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
ad80: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
ad90: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
ada0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
adb0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
adc0: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
add0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
ade0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
adf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae00: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ae10: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
ae20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ae30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
ae40: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20  .  if( regRowid 
ae50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
ae60: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ae70: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
ae80: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
ae90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
aea0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  regRowid);.  }. 
aeb0: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
aec0: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
aed0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
aee0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
aef0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
af00: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
af10: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
af20: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
af30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
af40: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
af50: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
af60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
af70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
af80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
af90: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
afa0: 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76  , addr); VdbeCov
afb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
afc0: 69 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65  if( pSort->regRe
afd0: 74 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64  turn ) sqlite3Vd
afe0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
aff0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65  eturn, pSort->re
b000: 67 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69  gReturn);.  sqli
b010: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b020: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
b030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
b040: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
b050: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
b060: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
b070: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
b080: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
b090: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
b0a0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
b0b0: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
b0c0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
b0d0: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
b0e0: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
b0f0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
b100: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
b110: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
b120: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
b130: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
b140: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
b150: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
b160: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
b170: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
b180: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
b190: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
b1a0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b1b0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
b1c0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
b1d0: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
b1e0: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
b1f0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
b200: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
b210: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
b220: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
b230: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
b240: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
b250: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
b260: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
b270: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
b280: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
b290: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
b2a0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
b2b0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
b2c0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
b2d0: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
b2e0: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
b2f0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
b300: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
b310: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
b320: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
b330: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
b340: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
b350: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
b360: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
b370: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
b380: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
b390: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
b3a0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
b3b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
b3c0: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
b3d0: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
b3e0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
b3f0: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
b400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
b410: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
b420: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
b430: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
b440: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b450: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b460: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
b470: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
b480: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
b490: 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73  l(A,B,C,D,E,F).s
b4a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b4b0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
b4c0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
b4d0: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
b4e0: 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Expr,.  const ch
b4f0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
b500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
b510: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
b520: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
b530: 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  l,.  u8 *pEstWid
b540: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
b550: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
b560: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
b570: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
b580: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
b590: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f  Col = 0;.#else /
b5a0: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
b5b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b5c0: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
b5d0: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
b5e0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
b5f0: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
b600: 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  A,B,F).static co
b610: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
b620: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
b630: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
b640: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
b650: 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b  u8 *pEstWidth.){
b660: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
b670: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b680: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b690: 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  A) */.  char con
b6a0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
b6b0: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
b6c0: 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66  Width = 1;..  if
b6d0: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
b6e0: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
b6f0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
b700: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
b710: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b720: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
b730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
b740: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
b750: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
b760: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
b770: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
b780: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
b790: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
b7a0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
b7b0: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
b7c0: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
b7d0: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
b7e0: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
b7f0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
b800: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
b810: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
b820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
b830: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
b840: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
b850: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
b860: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
b870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b880: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
b890: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
b8a0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
b8b0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
b8c0: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
b8d0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
b8e0: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
b8f0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
b900: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
b910: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b920: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b930: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
b940: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
b950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
b960: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b970: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
b980: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
b990: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
b9a0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
b9b0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
b9c0: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
b9d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
b9e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
b9f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
ba00: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ba10: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
ba20: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
ba30: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
ba40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ba50: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
ba60: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
ba70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
ba80: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
ba90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
baa0: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
bab0: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
bac0: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
bad0: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
bae0: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
baf0: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
bb00: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
bb10: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
bb20: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
bb30: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
bb40: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
bb50: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
bb60: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
bb70: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
bb80: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
bb90: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
bba0: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
bbb0: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
bbc0: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
bbd0: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
bbe0: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
bbf0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
bc00: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
bc10: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
bc20: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
bc30: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
bc40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
bc50: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
bc60: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
bc70: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
bc80: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
bc90: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
bca0: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
bcb0: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
bcc0: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
bcd0: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
bce0: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
bcf0: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
bd00: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
bd10: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
bd20: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
bd30: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
bd40: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
bd50: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
bd60: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
bd70: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
bd80: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
bd90: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
bda0: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
bdb0: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
bdc0: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
bdd0: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
bde0: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
bdf0: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
be00: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
be10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
be20: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
be30: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
be40: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
be50: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
be60: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
be70: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
be80: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
be90: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
bea0: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
beb0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
bec0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
bed0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
bee0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
bef0: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
bf00: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
bf10: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
bf20: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
bf30: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
bf40: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
bf50: 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c   && ALWAYS(iCol<
bf60: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
bf70: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
bf80: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
bf90: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
bfa0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
bfb0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
bfc0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
bfd0: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
bfe0: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
bff0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
c000: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
c010: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
c020: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
c030: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
c040: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
c050: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c060: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
c070: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
c080: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
c090: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
c0a0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
c0b0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c0c0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
c0d0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
c0e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
c0f0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c100: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
c110: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
c120: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
c130: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
c140: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
c150: 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  th); .        }.
c160: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c170: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
c180: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
c190: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
c1a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
c1b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
c1c0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
c1d0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
c1e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
c1f0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
c200: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
c210: 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53  Col) );.#ifdef S
c220: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c230: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
c240: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
c250: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
c260: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
c270: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
c280: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
c290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c2a0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
c2b0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
c2c0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
c2d0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
c2e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
c2f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  me;.          es
c300: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
c310: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
c320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c330: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
c340: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
c350: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
c360: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
c370: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
c380: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
c390: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
c3a0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
c3b0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44            zOrigD
c3c0: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
c3d0: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
c3e0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
c3f0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
c400: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
c410: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
c420: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
c430: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c440: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
c450: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
c460: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
c470: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
c480: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
c490: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
c4a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
c4b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
c4c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c4d0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
c4e0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
c4f0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c500: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
c510: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
c520: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c530: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
c540: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
c550: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
c560: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c570: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
c580: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
c590: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
c5a0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
c5b0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
c5c0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
c5d0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
c5e0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
c5f0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
c600: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c610: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
c620: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
c630: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
c640: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
c650: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
c660: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
c670: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c680: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
c690: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
c6a0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
c6b0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
c6c0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
c6d0: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
c6e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c6f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
c700: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c710: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c720: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
c730: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
c740: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
c750: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
c760: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
c770: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
c780: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
c790: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
c7a0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
c7b0: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
c7c0: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
c7d0: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
c7e0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
c7f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c800: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
c810: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
c820: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
c830: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
c840: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
c850: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
c860: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
c870: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
c880: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
c890: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
c8a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
c8b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
c8c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
c8d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
c8e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c8f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
c900: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
c910: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c920: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
c930: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c940: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
c950: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
c960: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
c970: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
c980: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c990: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
c9a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
c9b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
c9c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
c9d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
c9e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
c9f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ca00: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ca10: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
ca20: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
ca30: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
ca40: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
ca50: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
ca60: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
ca70: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
ca80: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
ca90: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
caa0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
cab0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
cac0: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
cad0: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
cae0: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
caf0: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
cb00: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
cb10: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
cb20: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
cb30: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
cb40: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
cb50: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
cb60: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
cb70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
cb80: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
cb90: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
cba0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
cbb0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
cbc0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
cbd0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
cbe0: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
cbf0: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
cc00: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
cc10: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
cc20: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
cc30: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
cc40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
cc50: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
cc60: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
cc70: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
cc80: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
cc90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
cca0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
ccb0: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
ccc0: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
ccd0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
cce0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
ccf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
cd00: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  TYPE) */.}../*.*
cd10: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cd20: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
cd30: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
cd40: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
cd50: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cd60: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
cd70: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
cd80: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
cd90: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
cda0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
cdb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
cdc0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
cdd0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
cde0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
cdf0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
ce00: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
ce10: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
ce20: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
ce30: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
ce40: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
ce50: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
ce60: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
ce70: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ce80: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
ce90: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
cea0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ceb0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
cec0: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
ced0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cee0: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
cef0: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
cf00: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
cf10: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
cf20: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
cf30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cf40: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
cf50: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
cf60: 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29  t || NEVER(v==0)
cf70: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
cf80: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
cf90: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
cfa0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
cfb0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
cfc0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
cfd0: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
cfe0: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
cff0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
d000: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
d010: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
d020: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
d030: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
d040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
d050: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
d060: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
d070: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
d080: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
d090: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
d0a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
d0b0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
d0c0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
d0d0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
d0e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
d0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d100: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d110: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
d120: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
d130: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
d140: 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d  lse if( (p->op==
d150: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
d160: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
d170: 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  N) && pTabList )
d180: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
d190: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
d1a0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
d1b0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
d1c0: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
d1d0: 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62  0; ALWAYS(j<pTab
d1e0: 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b  List->nSrc); j++
d1f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
d200: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
d210: 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65  ursor==p->iTable
d220: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
d230: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
d240: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
d250: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
d260: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
d270: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
d280: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
d290: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
d2a0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
d2b0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
d2c0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
d2d0: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
d2e0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
d2f0: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
d300: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
d310: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
d320: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d330: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
d340: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
d350: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
d360: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  es ){.        sq
d370: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d380: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d390: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
d3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
d3b0: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
d3c0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
d3d0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d3e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
d3f0: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
d400: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
d410: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
d420: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
d430: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
d440: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
d450: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
d460: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d470: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d480: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
d490: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
d4a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d4b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d4c0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d4d0: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
d4e0: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
d4f0: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
d500: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
d520: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
d530: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
d540: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
d550: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
d560: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
d570: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
d580: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d590: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d5a0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
d5b0: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
d5c0: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
d5d0: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
d5e0: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
d5f0: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
d600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
d610: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
d620: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
d630: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
d640: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
d650: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
d660: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
d670: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
d680: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
d690: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
d6a0: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
d6b0: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
d6c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
d6d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
d6e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
d6f0: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
d700: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
d710: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
d720: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
d730: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
d740: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
d750: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
d760: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
d770: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
d780: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
d790: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
d7a0: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
d7b0: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
d7c0: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
d7d0: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
d7e0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d7f0: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
d800: 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d   int selectColum
d810: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
d820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d840: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d850: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
d860: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
d870: 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
d880: 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
d890: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31  mn names */.  i1
d8a0: 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  6 *pnCol,       
d8b0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
d8c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
d8d0: 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
d8e0: 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
d8f0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d900: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
d910: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
d920: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d930: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
d940: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
d950: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
d960: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
d970: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d980: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
d990: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
d9a0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
d9b0: 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
d9c0: 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
d9d0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
d9e0: 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
d9f0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
da00: 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
da10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
da40: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
da50: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
da60: 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  xpr *p;         
da70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
da80: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73  pression for a s
da90: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
daa0: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
dab0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
dac0: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
dad0: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ame */.  int nNa
dae0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
daf0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
db00: 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20  name in zName[] 
db10: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  */..  if( pEList
db20: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
db30: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
db40: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
db50: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
db60: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
db70: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
db80: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
db90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
dba0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
dbb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43   = 0;.  }.  *pnC
dbc0: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61  ol = nCol;.  *pa
dbd0: 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66  Col = aCol;..  f
dbe0: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
dbf0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
dc00: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
dc10: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
dc20: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
dc30: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
dc40: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
dc50: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c  rSkipCollate(pEL
dc60: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
dc70: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
dc80: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
dc90: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
dca0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
dcb0: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
dcc0: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
dcd0: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
dce0: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
dcf0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
dd00: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
dd10: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
dd20: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
dd30: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
dd40: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
dd50: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
dd60: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
dd70: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
dd80: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
dd90: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
dda0: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
ddb0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
ddc0: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
ddd0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
dde0: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
ddf0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
de00: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
de10: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
de20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de30: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
de40: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
de50: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
de60: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
de70: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
de80: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
de90: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
dea0: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
deb0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
dec0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
ded0: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
dee0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
def0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
df00: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
df10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
df20: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
df30: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
df40: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
df50: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
df60: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
df70: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
df80: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
df90: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
dfa0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
dfb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
dfc0: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
dfd0: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
dfe0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
dff0: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
e000: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
e010: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
e020: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
e030: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
e040: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
e050: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
e060: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
e070: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
e080: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
e090: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
e0a0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
e0b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
e0c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e0d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e0e0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
e0f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
e100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
e110: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
e120: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
e130: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
e140: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
e150: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69    ** append an i
e160: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
e170: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
e180: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
e190: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
e1a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
e1b0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
e1c0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
e1d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
e1e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
e1f0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
e200: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
e210: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
e220: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
e230: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
e240: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
e250: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
e260: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
e270: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 3d 30          if( k>=0
e280: 20 26 26 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a   && zName[k]==':
e290: 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20  ' ) nName = k;. 
e2a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61         zName[nNa
e2b0: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  me] = 0;.       
e2c0: 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69   zNewName = sqli
e2d0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e2e0: 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b  %s:%d", zName, +
e2f0: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  +cnt);.        s
e300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e310: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
e320: 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d   zName = zNewNam
e330: 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d  e;.        j = -
e340: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  1;.        if( z
e350: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
e360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e370: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
e380: 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66   zName;.  }.  if
e390: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
e3a0: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
e3b0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
e3c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
e3d0: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
e3e0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
e3f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e400: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
e410: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
e420: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
e430: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e440: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e450: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e460: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
e470: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
e480: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
e490: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
e4a0: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
e4b0: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
e4c0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
e4d0: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
e4e0: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
e4f0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
e500: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
e510: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
e520: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
e530: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
e540: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
e550: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
e560: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
e570: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
e580: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e590: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
e5a0: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
e5b0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
e5c0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
e5d0: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61  resolved..*/.sta
e5e0: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
e5f0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
e600: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
e610: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e620: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
e630: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
e640: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
e650: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
e660: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
e670: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
e680: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e690: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
e6a0: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
e6b0: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
e6c0: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
e6d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e6e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
e6f0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
e700: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
e710: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
e720: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
e730: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
e740: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
e750: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
e760: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
e770: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
e780: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
e790: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
e7a0: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
e7b0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e7c0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
e7d0: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
e7e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e7f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e800: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e810: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
e820: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
e830: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
e840: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
e850: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
e860: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
e870: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
e880: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
e890: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
e8a0: 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e  ){.    p = a[i].
e8b0: 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d  pExpr;.    pCol-
e8c0: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
e8d0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c  DbStrDup(db, col
e8e0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
e8f0: 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a  0,0,0, &pCol->sz
e900: 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c  Est));.    szAll
e910: 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b   += pCol->szEst;
e920: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
e930: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
e940: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
e950: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
e960: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
e970: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
e980: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
e990: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
e9a0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
e9b0: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
e9c0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
e9d0: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
e9e0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e9f0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
ea00: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d     }.  }.  pTab-
ea10: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
ea20: 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a  te3LogEst(szAll*
ea30: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  4);.}../*.** Giv
ea40: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
ea50: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
ea60: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
ea70: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
ea80: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
ea90: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
eaa0: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
eab0: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
eac0: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
ead0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
eae0: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
eaf0: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
eb00: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
eb10: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
eb20: 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
eb30: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
eb40: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
eb50: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
eb60: 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
eb70: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
eb80: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
eb90: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
eba0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
ebb0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
ebc0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
ebd0: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
ebe0: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
ebf0: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
ec00: 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
ec10: 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
ec20: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
ec30: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ec40: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
ec50: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
ec60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ec70: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
ec80: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
ec90: 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c  fSelect() is onl
eca0: 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74  y used n context
ecb0: 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64  s where lookasid
ecc0: 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c  e.  ** is disabl
ecd0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
ece0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
ecf0: 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70  nabled==0 );.  p
ed00: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
ed10: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
ed20: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  ;.  pTab->nRowLo
ed30: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
ed40: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
ed50: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
ed60: 29 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  );.  selectColum
ed70: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
ed80: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
ed90: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
eda0: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
edb0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
edc0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
edd0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
ede0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
edf0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
ee00: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ee10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
ee20: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
ee30: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
ee40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ee50: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
ee60: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
ee70: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
ee80: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
ee90: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
eea0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
eeb0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
eec0: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
eed0: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
eee0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
eef0: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
ef00: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
ef10: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
ef20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ef30: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
ef40: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
ef50: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
ef60: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
ef70: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20  rse);.    if( v 
ef80: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
ef90: 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b  Op0(v, OP_Init);
efa0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
efb0: 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
efc0: 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
efd0: 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65  onEnabled(pParse
efe0: 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74  ->db,SQLITE_Fact
eff0: 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20  orOutConst).    
f000: 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
f010: 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
f020: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20   1;.    }..  }. 
f030: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
f040: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
f050: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
f060: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
f070: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
f080: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
f090: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
f0a0: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
f0b0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
f0c0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
f0d0: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
f0e0: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
f0f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
f100: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
f110: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
f120: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
f130: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
f140: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
f150: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
f160: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
f170: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
f180: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
f190: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
f1a0: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
f1b0: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
f1c0: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
f1d0: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
f1e0: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
f1f0: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
f200: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
f210: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
f220: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
f230: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
f240: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
f250: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
f260: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
f270: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
f280: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
f290: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
f2a0: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
f2b0: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
f2c0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
f2d0: 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
f2e0: 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
f2f0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
f300: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
f310: 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
f320: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
f330: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
f340: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
f350: 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
f360: 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
f370: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
f380: 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
f390: 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
f3a0: 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
f3b0: 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
f3c0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
f3d0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
f3e0: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
f3f0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
f400: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
f410: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
f420: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
f430: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
f440: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
f450: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
f460: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
f470: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
f480: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
f490: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
f4a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
f4b0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
f4c0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
f4d0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
f4e0: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
f4f0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
f500: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
f510: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
f520: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
f530: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
f540: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
f550: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
f560: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
f570: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
f580: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
f590: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
f5a0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
f5b0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
f5c0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
f5d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
f5e0: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
f5f0: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
f600: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
f610: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
f620: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
f630: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
f640: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
f650: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
f660: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
f670: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
f680: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
f690: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
f6a0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f6b0: 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
f6c0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
f6d0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
f6e0: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
f6f0: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
f700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f710: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
f720: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
f730: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f740: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f750: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
f760: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
f770: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f780: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
f790: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
f7a0: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
f7b0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
f7c0: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
f7d0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f7e0: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
f7f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f800: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
f810: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
f820: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
f830: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f840: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
f850: 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
f860: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f870: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
f880: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
f890: 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
f8a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f8b0: 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
f8c0: 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
f8d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f8e0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
f8f0: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
f900: 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
f910: 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
f920: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
f930: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
f940: 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
f950: 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
f960: 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
f970: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f980: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
f990: 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
f9a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f9b0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f9c0: 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
f9d0: 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
f9e0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
f9f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
fa00: 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
fa10: 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73  .      addr1 = s
fa20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fa30: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
fa40: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
fa50: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
fa60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fa70: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
fa80: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
fa90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
faa0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
fab0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fac0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fad0: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
fae0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
faf0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
fb00: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
fb10: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
fb20: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
fb30: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
fb40: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 20  IfPos, iLimit); 
fb50: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
fb60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fb70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
fb80: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
fb90: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
fba0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fbb0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
fbc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
fbd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
fbe0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
fbf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
fc00: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
fc10: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
fc20: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
fc30: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
fc40: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
fc50: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
fc60: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
fc70: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
fc80: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
fc90: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
fca0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fcb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
fcc0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
fcd0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
fce0: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
fcf0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
fd00: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
fd10: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
fd20: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
fd30: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
fd40: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
fd50: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
fd60: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
fd70: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
fd80: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
fd90: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
fda0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
fdb0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
fdc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
fdd0: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
fde0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
fdf0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
fe00: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
fe10: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
fe20: 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
fe30: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65  nExpr ){.    pRe
fe40: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
fe50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
fe60: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
fe70: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
fe80: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
fe90: 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
fea0: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
feb0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
fec0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63  parameter is a c
fed0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a  ompound SELECT.*
fee0: 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  * with an ORDER 
fef0: 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20  BY clause. This 
ff00: 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
ff10: 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  es and returns a
ff20: 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75   KeyInfo.** stru
ff30: 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66  cture suitable f
ff40: 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  or implementing 
ff50: 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a  the ORDER BY..**
ff60: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
ff70: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
ff80: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
ff90: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
ffa0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
ffb0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
ffc0: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75  onsible for ensu
ffd0: 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  ring that this s
ffe0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
fff0: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
10000 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
10010 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f  fo *multiSelectO
10020 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61  rderByKeyInfo(Pa
10030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
10040 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74  ect *p, int nExt
10050 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ra){.  ExprList 
10060 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
10070 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e  OrderBy;.  int n
10080 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
10090 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
100a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
100b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
100c0 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  nfo *pRet = sqli
100d0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
100e0 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78  db, nOrderBy+nEx
100f0 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  tra, 1);.  if( p
10100 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Ret ){.    int i
10110 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10120 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
10130 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
10140 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
10150 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e  em = &pOrderBy->
10160 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72  a[i];.      Expr
10170 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d   *pTerm = pItem-
10180 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f  >pExpr;.      Co
10190 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
101a0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
101b0 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
101c0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  te ){.        pC
101d0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
101e0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
101f0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
10200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
10210 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
10220 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10230 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69   p, pItem->u.x.i
10240 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20  OrderByCol-1);. 
10250 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
10260 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  ==0 ) pColl = db
10270 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
10280 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
10290 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
102b0 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
102c0 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
102d0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
102e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
102f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
10300 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
10310 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70  pRet) );.      p
10320 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Ret->aColl[i] = 
10330 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65  pColl;.      pRe
10340 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  t->aSortOrder[i]
10350 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
10360 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
10370 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
10380 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
10390 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
103a0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E./*.** This rou
103b0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56  tine generates V
103c0 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70  DBE code to comp
103d0 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ute the content 
103e0 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53  of a WITH RECURS
103f0 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20  IVE.** query of 
10400 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
10410 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62    <recursive-tab
10420 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71  le> AS (<setup-q
10430 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c  uery> UNION [ALL
10440 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65  ] <recursive-que
10450 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ry>).**         
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  \___________/   
10480 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
10490 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69           p->pPri
104c0 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  or              
104d0 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a          p.**.**.
104e0 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63  ** There is exac
104f0 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  tly one referenc
10500 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69  e to the recursi
10510 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ve-table in the 
10520 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f  FROM clause.** o
10530 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  f recursive-quer
10540 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74  y, marked with t
10550 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e  he SrcList->a[].
10560 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67  isRecursive flag
10570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75  ..**.** The setu
10580 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63  p-query runs onc
10590 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
105a0 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20   initial set of 
105b0 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20  rows that go.** 
105c0 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62  into a Queue tab
105d0 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78  le.  Rows are ex
105e0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
105f0 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65   Queue table one
10600 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63   by.** one.  Eac
10610 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20  h row extracted 
10620 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75  from Queue is ou
10630 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
10640 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
10650 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
10660 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75   (now in the iCu
10670 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63  rrent table) bec
10680 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  omes the content
10690 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72   of the.** recur
106a0 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61  sive-table for a
106b0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
106c0 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75   run.  The outpu
106d0 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  t of the recursi
106e0 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61  ve-query.** is a
106f0 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  dded back into t
10700 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
10710 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f   Then another ro
10720 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  w is extracted f
10730 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64  rom Queue.** and
10740 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63   the iteration c
10750 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74  ontinues until t
10760 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
10770 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
10780 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
10790 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  uery operator is
107a0 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64   UNION then no d
107b0 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
107c0 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74  e ever.** insert
107d0 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ed into the Queu
107e0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44  e table.  The iD
107f0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65  istinct table ke
10800 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c  eps a copy of al
10810 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68  l rows.** that h
10820 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e  ave ever been in
10830 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75  serted into Queu
10840 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70  e and causes dup
10850 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a  licates to be.**
10860 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20   discarded.  If 
10870 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  the operator is 
10880 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20  UNION ALL, then 
10890 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61  duplicates are a
108a0 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49  llowed..** .** I
108b0 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20  f the query has 
108c0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
108d0 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  n entries in the
108e0 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65   Queue table are
108f0 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45   kept in.** ORDE
10900 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74  R BY order and t
10910 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
10920 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20  s extracted for 
10930 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74  each cycle.  Wit
10940 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52  hout.** an ORDER
10950 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74   BY, the Queue t
10960 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46  able is just a F
10970 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  IFO..**.** If a 
10980 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20  LIMIT clause is 
10990 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74  provided, then t
109a0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f  he iteration sto
109b0 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72  ps after LIMIT r
109c0 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ows.** have been
109d0 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
109e0 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65  .  A LIMIT of ze
109f0 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  ro means to outp
10a00 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61  ut no rows and a
10a10 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d  .** negative LIM
10a20 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  IT means to outp
10a30 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66  ut all rows.  If
10a40 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   there is also a
10a50 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
10a60 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69  ** with a positi
10a70 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  ve value, then t
10a80 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
10a90 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63  outputs are disc
10aa0 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20  arded rather.** 
10ab0 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20  than being sent 
10ac0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c  to pDest.  The L
10ad0 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20  IMIT count does 
10ae0 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20  not begin until 
10af0 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20  after OFFSET.** 
10b00 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73  rows have been s
10b10 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
10b20 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57  c void generateW
10b30 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
10b40 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
10b50 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
10b60 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
10b70 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
10b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10b90 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
10ba0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
10bb0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
10bc0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
10bd0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
10be0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
10bf0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
10c00 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f   p->pSrc;      /
10c10 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
10c20 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
10c30 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ve query */.  in
10c40 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  t nCol = p->pELi
10c50 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e  st->nExpr;  /* N
10c60 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
10c70 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
10c80 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  e table */.  Vdb
10c90 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
10ca0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
10cb0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
10cc0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
10cd0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ruction */.  Sel
10ce0 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d  ect *pSetup = p-
10cf0 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68  >pPrior;   /* Th
10d00 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f  e setup query */
10d10 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d30 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
10d40 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
10d50 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
10d60 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e  ;      /* CONTIN
10d70 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64  UE and BREAK add
10d80 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
10d90 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
10da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10db0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
10dc0 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65  /.  int regCurre
10dd0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
10de0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
10df0 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61  lding Current ta
10e00 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75  ble */.  int iQu
10e10 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  eue;            
10e20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75         /* The Qu
10e30 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
10e40 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30  nt iDistinct = 0
10e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10e60 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
10e70 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
10e80 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  N */.  int eDest
10e90 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20   = SRT_Fifo;    
10ea0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77       /* How to w
10eb0 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f  rite to Queue */
10ec0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10ed0 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20  stQueue;        
10ee0 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74   /* SelectDest t
10ef0 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75  argetting the Qu
10f00 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
10f10 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f30 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
10f40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
10f70 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
10f80 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
10f90 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
10fa0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
10fb0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
10fc0 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  fset;       /* S
10fd0 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f  aved LIMIT and O
10fe0 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72  FFSET */.  int r
10ff0 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73  egLimit, regOffs
11000 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et;      /* Regi
11010 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49  sters used by LI
11020 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
11030 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
11040 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
11050 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71  do a recursive q
11060 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71  uery */.  if( sq
11070 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11080 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
11090 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30  CURSIVE, 0, 0, 0
110a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
110b0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49  * Process the LI
110c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
110d0 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20  lauses, if they 
110e0 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42  exist */.  addrB
110f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
11100 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
11110 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
11120 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
11130 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  p, addrBreak);. 
11140 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
11150 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d  mit;.  pOffset =
11160 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72   p->pOffset;.  r
11170 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  egLimit = p->iLi
11180 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74  mit;.  regOffset
11190 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
111a0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e   p->pLimit = p->
111b0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  pOffset = 0;.  p
111c0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
111d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
111e0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
111f0 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
11200 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
11210 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
11220 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
11230 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
11240 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
11250 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
11260 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76  >a[i].isRecursiv
11270 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
11280 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
11290 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
112a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
112b0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
112c0 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
112d0 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
112e0 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
112f0 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
11300 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
11310 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
11320 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
11330 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
11340 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
11350 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
11360 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
11370 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
11380 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
11390 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
113a0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
113b0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
113c0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
113d0 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
113e0 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
113f0 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
11400 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
11410 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
11420 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
11430 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
11440 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
11450 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
11460 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
11470 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
11480 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
11490 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
114a0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
114b0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
114c0 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
114d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
114e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
114f0 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
11500 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
11510 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
11520 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
11530 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
11540 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
11550 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
11560 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
11570 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
11580 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
11590 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
115a0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
115b0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
115e0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
115f0 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
11600 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11610 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
11620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11630 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
11640 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
11650 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
11660 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
11670 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
11680 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
11690 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
116a0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
116b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
116c0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
116d0 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
116e0 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
116f0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
11700 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
11710 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
11720 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
11730 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
11740 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
11750 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
11760 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
11770 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
11780 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
11790 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
117a0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
117b0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
117c0 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
117d0 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
117e0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
117f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
11800 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
11810 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
11820 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
11830 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
11840 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
11850 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
11860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11870 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
11880 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
11890 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
118a0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
118b0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
118c0 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
118d0 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
118e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
118f0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
11900 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
11910 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
11920 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
11930 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
11940 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11950 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
11960 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
11970 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
11980 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
11990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
119a0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
119b0 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
119c0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
119d0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
119e0 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
119f0 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
11a00 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
11a10 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
11a20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
11a30 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11a40 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
11a50 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
11a60 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
11a70 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
11a80 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
11a90 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20  , iCurrent,.    
11aa0 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61    0, 0, pDest, a
11ab0 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
11ac0 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69  ak);.  if( regLi
11ad0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
11ae0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11af0 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
11b00 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42   regLimit, addrB
11b10 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
11b20 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
11b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
11b40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
11b50 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
11b60 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
11b70 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
11b80 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
11b90 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
11ba0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
11bb0 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
11bc0 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
11bd0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
11be0 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d  Queue..  */.  p-
11bf0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
11c00 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11c10 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
11c20 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ue);.  assert( p
11c30 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20  ->pPrior==0 );. 
11c40 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65   p->pPrior = pSe
11c50 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20  tup;..  /* Keep 
11c60 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70  running the loop
11c70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
11c80 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73   is empty */.  s
11c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11ca0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
11cb0 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
11cc0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
11cd0 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
11ce0 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
11cf0 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
11d00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11d10 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11d20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
11d30 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
11d40 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
11d50 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11d60 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
11d70 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
11d80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11d90 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
11da0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
11db0 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
11dc0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
11dd0 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
11de0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11df0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
11e00 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
11e10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
11e20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
11e30 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
11e40 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11e50 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11e60 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11e70 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11e80 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
11e90 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  Error message fo
11ea0 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f  r when two or mo
11eb0 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f  re terms of a co
11ec0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61  mpound select ha
11ed0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ve different.** 
11ee0 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73  size result sets
11ef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11f00 20 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54   selectWrongNumT
11f10 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20  ermsError(Parse 
11f20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
11f30 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65  *p){.  if( p->se
11f40 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
11f50 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
11f60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11f70 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
11f80 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
11f90 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
11fa0 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
11fb0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11fc0 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
11fd0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
11fe0 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
11ff0 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
12000 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
12010 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
12020 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
12030 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
12040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  .}../*.** Handle
12050 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
12060 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
12070 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
12080 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
12090 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
120a0 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
120b0 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
120c0 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
120d0 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
120e0 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
120f0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
12100 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
12110 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
12120 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
12130 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
12140 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
12150 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
12160 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
12170 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
12180 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
12190 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
121a0 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
121b0 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
121c0 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
121d0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
121e0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
121f0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
12200 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
12210 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12220 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12230 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12250 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12260 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12270 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12280 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12290 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
122a0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
122b0 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
122c0 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 45 78  Prior;.  int nEx
122d0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
122e0 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  nExpr;.  int nRo
122f0 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
12300 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
12310 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
12320 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
12330 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
12340 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
12350 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
12360 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
12370 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
12380 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
12390 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
123a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
123b0 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
123c0 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
123d0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
123e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
123f0 3d 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  =nExpr ){.      
12400 73 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  selectWrongNumTe
12410 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c  rmsError(pParse,
12420 20 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   p);.      retur
12430 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
12440 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  f( p->pPrior==0 
12450 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
12460 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d 3e  ert( p->pPrior->
12470 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20 20  pNext==p );.    
12480 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
12490 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77 68     nRow++;.  }wh
124a0 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65 28  ile(1);.  while(
124b0 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f 72   p ){.    pPrior
124c0 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
124d0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
124e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
124f0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
12500 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 70  p, pDest);.    p
12510 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
12520 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  r;.    if( rc ) 
12530 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53  break;.    p->nS
12540 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77 3b  electRow = nRow;
12550 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
12560 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
12570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
12580 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12590 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
125a0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
125b0 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
125c0 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
125d0 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
125e0 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
125f0 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
12600 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
12610 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
12620 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
12630 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
12640 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
12650 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
12660 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
12670 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
12680 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
12690 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
126a0 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
126b0 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
126c0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
126d0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
126e0 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
126f0 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
12700 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
12710 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
12720 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
12730 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
12740 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
12750 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
12760 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
12770 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
12780 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
12790 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
127a0 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
127b0 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
127c0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
127d0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
127e0 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
127f0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
12800 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
12810 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
12820 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
12830 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
12840 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12850 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
12860 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
12870 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
12880 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
12890 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
128a0 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
128b0 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
128c0 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
128d0 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
128e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
128f0 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
12900 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
12910 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
12920 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
12930 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
12940 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
12950 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
12960 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
12970 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
12980 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
12990 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
129a0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
129b0 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
129c0 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
129d0 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
129e0 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
129f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12a00 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
12a10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12a20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12a30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12a40 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12a50 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12a60 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12a70 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12a80 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12a90 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12aa0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12ab0 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
12ac0 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
12ad0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
12ae0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
12af0 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
12b00 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
12b10 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
12b20 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
12b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
12b40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12b50 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
12b60 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
12b70 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
12b80 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
12b90 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
12ba0 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
12bb0 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
12bc0 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
12bd0 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
12be0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12bf0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12c00 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
12c10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
12c20 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
12c30 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  1 = 0;        /*
12c40 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
12c50 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
12c60 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20  int iSub2 = 0;  
12c70 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
12c80 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
12c90 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
12ca0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
12cb0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
12cc0 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
12cd0 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
12ce0 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
12cf0 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
12d00 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
12d10 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
12d20 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
12d30 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
12d40 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
12d50 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
12d60 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
12d70 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
12d80 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74  much */.  assert
12d90 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
12da0 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d   SF_Recursive)==
12db0 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
12dc0 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
12dd0 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
12de0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
12df0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
12e00 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
12e10 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
12e20 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
12e30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12e40 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
12e50 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
12e60 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
12e70 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
12e80 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
12e90 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
12ea0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
12eb0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
12ec0 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
12ed0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
12ee0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ef0 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
12f00 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
12f10 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
12f20 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
12f30 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
12f40 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
12f50 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
12f60 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
12f70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12f80 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
12f90 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
12fa0 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
12fb0 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
12fc0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
12fd0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
12fe0 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
12ff0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
13000 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
13010 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
13020 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
13030 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
13040 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
13050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13060 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
13070 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
13080 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
13090 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
130a0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
130b0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
130c0 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
130d0 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
130e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
130f0 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61  l handling for a
13100 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
13110 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
13120 20 61 73 20 61 20 56 41 4c 55 45 53 20 63 6c 61   as a VALUES cla
13130 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use..  */.  if( 
13140 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13150 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20  _MultiValue ){. 
13160 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
13170 65 63 74 56 61 6c 75 65 73 28 70 50 61 72 73 65  ectValues(pParse
13180 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
13190 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
131a0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
131b0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
131c0 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
131d0 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
131e0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
131f0 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
13200 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
13210 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
13220 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
13230 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
13240 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
13250 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
13260 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
13270 20 29 7b 0a 20 20 20 20 73 65 6c 65 63 74 57 72   ){.    selectWr
13280 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
13290 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
132a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
132b0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
132c0 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  nd;.  }..#ifndef
132d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
132e0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
132f0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
13300 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  e ){.    generat
13310 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
13320 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ery(pParse, p, &
13330 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  dest);.  }else.#
13340 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
13350 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61  ound SELECTs tha
13360 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  t have an ORDER 
13370 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61  BY clause are ha
13380 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
13390 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
133a0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
133b0 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
133c0 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ctOrderBy(pParse
133d0 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  , p, pDest);.  }
133e0 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  else..  /* Gener
133f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
13400 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
13410 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
13420 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68  s..  */.  switch
13430 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
13440 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20  ase TK_ALL: {.  
13450 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30      int addr = 0
13460 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d  ;.      int nLim
13470 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  it;.      assert
13480 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
13490 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
134a0 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  r->iLimit = p->i
134b0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
134c0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
134d0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
134e0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
134f0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
13500 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73     pPrior->pOffs
13510 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
13520 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13530 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
13540 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13550 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13560 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13570 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
13580 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
13590 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
135a0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
135b0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
135c0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
135d0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
135e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
135f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
13600 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
13610 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74  = pPrior->iLimit
13620 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
13630 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66  et = pPrior->iOf
13640 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
13650 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
13660 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
13670 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13680 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c   OP_IfNot, p->iL
13690 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
136a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
136b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
136c0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
136d0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
136e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
136f0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
13700 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
13710 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13720 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13730 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13740 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
13750 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13760 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
13770 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
13780 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
13790 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
137a0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
137b0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
137c0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
137d0 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
137e0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
137f0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13800 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
13810 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20  mit, &nLimit).  
13820 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
13830 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
13840 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20  w > (u64)nLimit 
13850 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13860 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
13870 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
13880 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
13890 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
138a0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
138b0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
138c0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
138d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
138e0 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
138f0 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
13900 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
13910 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
13920 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
13930 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
13940 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
13950 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
13960 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
13970 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
13980 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
13990 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
139a0 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
139b0 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
139c0 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
139d0 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
139e0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
139f0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
13a00 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
13a10 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
13a20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
13a30 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
13a40 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
13a50 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
13a60 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
13a70 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
13a80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13a90 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
13aa0 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  );.      priorOp
13ab0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
13ac0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
13ad0 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
13ae0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
13af0 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
13b00 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
13b10 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
13b20 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
13b30 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
13b40 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
13b50 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
13b60 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
13b70 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
13b80 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
13b90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13ba0 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
13bb0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
13bc0 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
13bd0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
13be0 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
13bf0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
13c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13c10 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
13c20 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
13c30 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
13c40 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
13c50 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
13c60 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
13c70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
13c80 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
13c90 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
13ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
13cb0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
13cc0 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
13cd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13ce0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
13cf0 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
13d00 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
13d10 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
13d20 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
13d30 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
13d40 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
13d50 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52  r;.        findR
13d60 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c  ightmost(p)->sel
13d70 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
13d80 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
13d90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
13da0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
13db0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
13dc0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
13dd0 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
13de0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13df0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
13e00 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
13e10 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
13e20 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
13e30 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
13e40 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
13e50 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
13e60 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
13e70 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
13e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e90 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13ea0 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
13eb0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
13ec0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
13ed0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
13ee0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
13ef0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
13f00 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
13f10 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
13f20 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
13f30 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
13f40 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
13f50 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
13f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
13f70 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
13f80 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
13f90 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
13fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13fb0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
13fc0 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
13fd0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
13fe0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
13ff0 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
14000 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
14010 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
14020 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
14030 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
14040 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14050 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14060 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14070 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14080 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14090 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
140a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
140b0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
140c0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
140d0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
140e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
140f0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
14100 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
14110 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
14120 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
14130 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
14140 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
14150 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
14160 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
14170 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
14180 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
14190 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
141a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
141b0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
141c0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
141d0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
141e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70  op==TK_UNION ) p
141f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
14200 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14210 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
14220 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
14230 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
14240 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
14250 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
14260 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
14270 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
14280 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
14290 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
142a0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
142b0 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
142c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
142d0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
142e0 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
142f0 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
14300 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
14310 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14320 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
14330 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
14340 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
14350 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
14360 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
14370 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
14380 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
14390 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
143a0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
143b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
143c0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
143d0 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
143e0 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
143f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
14400 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
14410 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
14420 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
14430 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
14440 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
14450 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
14460 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
14470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
14480 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
14490 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
144a0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
144b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
144c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
144d0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
144e0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
144f0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
14500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14510 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
14520 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
14530 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
14540 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53  e(v);.        iS
14550 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
14560 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
14570 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
14580 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
14590 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
145a0 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
145d0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
145e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
145f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
14600 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
14610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14620 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
14630 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
14640 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
14650 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
14660 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14670 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
14680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
146a0 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
146b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
146c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
146d0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
146e0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
146f0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
14700 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
14710 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
14720 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
14730 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
14740 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
14750 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
14760 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
14770 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
14780 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
14790 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
147a0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
147b0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
147c0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
147d0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
147e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
147f0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
14800 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
14810 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
14820 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
14830 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
14840 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
14850 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
14860 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
14870 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
14880 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
14890 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
148a0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
148b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
148c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
148d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
148e0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
148f0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
14900 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
14910 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
14920 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
14930 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
14940 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
14950 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
14960 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
14970 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14980 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
14990 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
149a0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
149b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
149c0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
149d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
149e0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
149f0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
14a00 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
14a10 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14a20 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
14a30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14a40 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
14a50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14a60 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
14a70 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
14a80 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
14a90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
14aa0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
14ab0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
14ac0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
14ad0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
14ae0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
14af0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
14b00 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
14b10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14b20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14b30 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
14b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
14b50 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
14b60 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
14b70 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
14b80 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
14b90 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14ba0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
14bb0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
14bc0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
14bd0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
14be0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
14bf0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
14c00 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
14c10 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
14c20 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
14c30 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14c40 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14c50 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
14c60 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
14c70 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
14c80 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
14c90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14cb0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
14cc0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
14cd0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
14ce0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
14cf0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
14d00 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
14d10 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
14d20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14d30 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
14d40 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
14d50 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
14d60 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
14d70 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
14d80 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
14d90 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
14da0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
14db0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
14dc0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
14dd0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
14de0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
14df0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14e00 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14e10 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
14e20 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
14e30 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
14e40 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
14e50 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
14e60 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
14e70 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
14e80 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
14e90 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
14ea0 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
14eb0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
14ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
14ed0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
14ee0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
14ef0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
14f00 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
14f10 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
14f20 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
14f30 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
14f40 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
14f50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14f60 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
14f70 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
14f80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
14f90 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14fa0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14fb0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
14fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14fd0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
14fe0 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
14ff0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15000 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
15010 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
15020 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43  t, r1, 0); VdbeC
15030 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15040 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15050 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15060 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
15070 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15080 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
15090 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
150b0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
150c0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
150d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
150e0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
150f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15100 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15110 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
15120 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
15130 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
15140 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15150 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
15160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15170 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15180 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
15190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
151a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
151b0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
151c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
151d0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
151e0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
151f0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
15200 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
15210 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
15220 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
15230 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
15240 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
15250 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
15260 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
15270 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
15280 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
15290 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
152a0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
152b0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
152c0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
152d0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
152e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
152f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
15300 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
15310 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
15320 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
15330 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
15340 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
15350 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
15360 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
15370 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
15380 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
15390 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
153a0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
153b0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
153c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
153d0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
153e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15410 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
15420 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
15430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
15440 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
15450 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
15460 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
15470 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
15480 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
15490 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
154a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
154b0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
154c0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
154d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
154e0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
154f0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
15500 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15530 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
15540 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
15550 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
15560 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
15570 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15580 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
15590 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
155a0 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
155b0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
155c0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
155d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
155e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
155f0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15600 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
15610 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
15620 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
15630 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
15640 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
15650 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
15660 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
15670 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
15680 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
15690 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
156a0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
156b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
156c0 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
156d0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
156e0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
156f0 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
15700 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
15710 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
15720 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
15730 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
15740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
15750 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
15760 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
15770 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
15780 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
15790 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
157a0 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
157b0 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
157c0 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
157d0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
157e0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
157f0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
15800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
15810 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
15820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15830 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
15840 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
15850 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15860 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
15870 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
15880 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
15890 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
158b0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
158c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
158d0 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
158e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
158f0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15900 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
15910 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
15920 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
15930 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
15940 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
15950 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
15960 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
15970 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
15980 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
15990 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
159a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
159b0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
159c0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
159d0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
159e0 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
159f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
15a00 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
15a10 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
15a20 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
15a30 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
15a40 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
15a50 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
15a60 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
15a70 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
15a80 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
15a90 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
15aa0 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
15ab0 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
15ac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
15ad0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
15ae0 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
15af0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
15b00 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
15b10 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
15b20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
15b30 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
15b40 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
15b50 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
15b60 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
15b70 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
15b80 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
15b90 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
15ba0 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
15bb0 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
15bc0 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
15bd0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
15be0 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
15bf0 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
15c00 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
15c10 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
15c20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
15c30 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
15c40 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
15c50 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
15c60 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
15c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
15c80 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
15c90 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
15ca0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
15cb0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15cc0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15cd0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15ce0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
15cf0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
15d00 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
15d10 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
15d20 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
15d30 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
15d40 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
15d50 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
15d60 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
15d70 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
15d80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
15d90 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
15da0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
15db0 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
15dc0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
15dd0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
15de0 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
15df0 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
15e00 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15e10 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
15e20 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
15e30 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
15e40 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
15e50 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
15e60 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
15e70 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
15e80 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
15e90 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
15ea0 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
15eb0 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
15ec0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15ed0 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
15ee0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
15ef0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
15f00 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
15f10 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
15f20 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
15f30 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
15f40 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
15f50 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
15f60 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
15f70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15f80 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
15f90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15fa0 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
15fb0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15fc0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
15fd0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
15fe0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16010 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
16020 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
16030 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16040 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16050 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
16060 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
16070 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f 76  , j2+2); VdbeCov
16080 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
16090 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
160a0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
160b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
160c0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
160d0 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
160e0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
160f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16100 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
16110 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
16120 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
16130 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
16140 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
16150 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
16160 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
16170 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
16180 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
16190 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
161a0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
161b0 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
161c0 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
161d0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
161e0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
161f0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
16200 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
16210 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
16220 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
16230 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
16240 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
16250 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
16260 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16270 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
16280 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
16290 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
162a0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
162b0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
162c0 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
162d0 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
162e0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
162f0 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
16300 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16310 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
16320 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
16330 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
16340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16350 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
16360 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
16370 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
16380 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16390 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
163a0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
163b0 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
163c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
163d0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
163e0 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
163f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
16400 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
16410 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
16420 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
16430 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
16440 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
16450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
16460 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
16470 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
16480 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
16490 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
164a0 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
164b0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
164c0 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
164d0 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
164e0 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
164f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
16500 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
16510 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
16520 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
16530 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
16540 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
16550 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
16560 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
16570 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
16580 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
16590 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
165a0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
165b0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
165c0 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
165d0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
165e0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
165f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16600 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16610 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
16620 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
16630 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
16640 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
16650 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16660 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16670 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
16680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16690 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
166a0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
166b0 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
166c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
166d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
166e0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
166f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
16700 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
16710 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
16720 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
16730 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
16740 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
16750 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
16760 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
16770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
16780 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
16790 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
167a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
167b0 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
167c0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
167d0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
167e0 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
167f0 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
16800 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
16810 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16820 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
16830 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
16840 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
16850 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
16860 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
16870 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16880 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
16890 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
168a0 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
168b0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
168c0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
168d0 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
168e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
168f0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
16900 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
16910 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
16920 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
16930 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16940 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
16950 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
16960 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
16970 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
16980 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
16990 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
169a0 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
169b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
169c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
169d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
169e0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
169f0 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
16a00 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
16a10 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
16a20 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
16a30 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
16a40 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
16a50 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
16a60 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
16a70 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
16a80 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
16a90 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
16aa0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
16ab0 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
16ac0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
16ad0 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
16ae0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
16af0 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
16b00 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
16b10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
16b20 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
16b30 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
16b40 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
16b50 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
16b60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16b70 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
16b80 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
16b90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16ba0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
16bb0 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
16bc0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
16bd0 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
16be0 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
16bf0 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
16c00 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
16c10 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
16c20 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
16c30 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
16c40 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
16c50 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
16c60 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
16c70 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
16c80 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
16c90 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
16ca0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
16cb0 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
16cc0 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
16cd0 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
16ce0 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
16cf0 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
16d00 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
16d10 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
16d20 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
16d30 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
16d40 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
16d50 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
16d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16d80 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
16d90 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
16da0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
16db0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
16dc0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
16dd0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
16de0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
16df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16e00 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
16e10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
16e20 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
16e30 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
16e40 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
16e50 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
16e60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16e70 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70  _DecrJumpZero, p
16e80 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
16e90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16ea0 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
16eb0 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
16ec0 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
16ed0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
16ee0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
16ef0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
16f00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16f10 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
16f20 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
16f30 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
16f40 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
16f50 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
16f60 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
16f70 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
16f80 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
16f90 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
16fa0 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
16fb0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
16fc0 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
16fd0 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
16fe0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
16ff0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
17000 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
17010 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
17020 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
17030 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
17040 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
17050 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
17060 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
17070 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
17080 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
17090 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
170a0 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
170b0 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
170c0 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
170d0 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
170e0 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
170f0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
17100 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
17110 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
17120 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
17130 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
17140 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
17150 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
17160 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
17170 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
17180 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
17190 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
171a0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
171b0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
171c0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
171d0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
171e0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
171f0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
17200 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
17210 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
17220 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
17230 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
17240 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
17250 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
17260 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
17270 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
17280 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
17290 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
172a0 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
172b0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
172c0 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
172d0 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
172e0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
172f0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
17300 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
17310 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
17320 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
17330 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
17340 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
17350 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
17360 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
17370 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
17380 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
17390 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
173a0 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
173b0 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
173c0 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
173d0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
173e0 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
173f0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
17400 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
17410 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
17420 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
17430 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
17440 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
17450 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
17460 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
17470 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
17480 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
17490 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
174a0 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
174b0 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
174c0 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
174d0 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
174e0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
174f0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
17500 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
17510 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
17520 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
17530 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
17540 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
17550 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
17560 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
17570 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
17580 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
17590 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
175a0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
175b0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
175c0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
175d0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
175e0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
175f0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
17600 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
17610 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
17620 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
17630 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
17640 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
17650 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
17660 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
17670 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
17680 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
17690 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
176a0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
176b0 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
176c0 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
176d0 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
176e0 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
176f0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
17700 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
17710 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
17720 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
17730 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
17740 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
17750 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
17760 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
17770 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
17780 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
17790 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
177a0 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
177b0 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
177c0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
177d0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
177e0 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
177f0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
17800 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
17810 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
17820 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
17830 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
17840 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
17850 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
17860 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
17870 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
17880 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
17890 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
178a0 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
178b0 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
178c0 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
178d0 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
178e0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
178f0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
17900 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
17910 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
17920 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
17930 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
17940 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
17950 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
17960 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
17970 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
17980 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
17990 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
179a0 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
179b0 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
179c0 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
179d0 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
179e0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
179f0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
17a00 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
17a10 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
17a20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
17a30 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
17a40 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
17a50 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
17a60 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
17a70 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
17a80 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
17a90 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
17aa0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
17ab0 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
17ac0 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
17ad0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
17ae0 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
17af0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
17b00 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
17b10 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
17b20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
17b30 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
17b40 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
17b50 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
17b60 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
17b70 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
17b80 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
17b90 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
17ba0 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
17bb0 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
17bc0 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
17bd0 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
17be0 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
17bf0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
17c00 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
17c10 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
17c20 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
17c30 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
17c40 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
17c50 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
17c60 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
17c70 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
17c80 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
17c90 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
17ca0 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
17cb0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
17cc0 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
17cd0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
17ce0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
17cf0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17d00 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
17d10 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
17d20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
17d30 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
17d40 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
17d50 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
17d60 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
17d70 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
17d80 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
17d90 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
17da0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
17db0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17dc0 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
17dd0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
17de0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
17df0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
17e00 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
17e10 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
17e20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
17e30 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
17e40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
17e50 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
17e60 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
17e70 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
17e80 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
17e90 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
17ea0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
17eb0 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
17ec0 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
17ed0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
17ee0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
17ef0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
17f00 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
17f10 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17f20 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
17f30 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
17f40 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
17f50 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
17f60 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
17f70 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
17f80 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
17f90 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
17fa0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
17fb0 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
17fc0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
17fd0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
17fe0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
17ff0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
18000 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18010 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
18020 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18030 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
18040 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
18050 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18060 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
18070 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18080 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
18090 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
180a0 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
180b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
180c0 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
180d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
180e0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
180f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18100 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
18110 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
18120 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18130 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
18140 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
18150 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
18160 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
18170 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
18180 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18190 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
181a0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
181b0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
181c0 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
181d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
181e0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
181f0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
18200 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
18210 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
18220 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
18230 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
18240 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18250 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
18260 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18270 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
18280 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
18290 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
182a0 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
182b0 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
182c0 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
182d0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
182e0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
182f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
18300 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
18310 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
18320 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
18330 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
18340 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
18350 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
18360 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
18370 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
18380 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
18390 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
183a0 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
183b0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
183c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
183d0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
183e0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
183f0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
18400 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
18410 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
18420 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
18430 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
18440 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
18450 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
18460 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
18470 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18490 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
184a0 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
184b0 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
184c0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
184d0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
184e0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
184f0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
18500 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
18510 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
18520 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
18530 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
18540 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
18550 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
18560 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
18570 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
18580 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
18590 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
185a0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
185b0 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
185c0 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
185d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
185e0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
185f0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
18600 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
18610 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
18620 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
18630 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
18640 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
18650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18660 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
18670 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
18680 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
18690 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
186a0 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
186b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
186c0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
186d0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
186e0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
186f0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
18700 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
18710 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
18720 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
18730 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
18740 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
18750 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
18760 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
18770 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
18780 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
18790 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
187a0 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
187b0 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
187c0 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
187d0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
187e0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
187f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18800 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
18810 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
18820 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
18830 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
18840 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
18850 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
18860 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
18870 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
18880 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
18890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
188a0 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
188b0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
188c0 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
188d0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
188e0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
188f0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
18900 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
18910 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18920 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
18930 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
18940 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
18950 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
18960 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
18970 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
18980 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
18990 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
189a0 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
189b0 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
189c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
189d0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
189e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
189f0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
18a00 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
18a10 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
18a20 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
18a30 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
18a40 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
18a50 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
18a60 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
18a70 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
18a80 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
18a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18aa0 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
18ab0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
18ac0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
18ad0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
18ae0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
18af0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
18b00 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18b10 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
18b20 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
18b30 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
18b40 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
18b50 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
18b60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18b70 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
18b80 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
18b90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
18ba0 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
18bb0 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
18bc0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
18bd0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
18be0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18bf0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
18c00 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
18c10 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
18c20 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
18c30 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
18c40 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
18c50 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
18c60 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
18c70 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
18c80 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
18c90 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
18ca0 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
18cb0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
18cc0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
18cd0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
18ce0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
18cf0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
18d00 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
18d10 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
18d20 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
18d30 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
18d40 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
18d50 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
18d60 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
18d70 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
18d80 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
18d90 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
18da0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
18db0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
18dc0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
18dd0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
18de0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
18df0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
18e00 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
18e10 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
18e20 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
18e30 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18e40 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
18e50 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 69 73 20  ist->nExpr ) is 
18e60 61 6c 73 6f 20 74 72 75 65 0a 20 20 20 20 20 20  also true.      
18e70 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 66 6f 72 20  ** but only for 
18e80 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 53 45 4c 45  well-formed SELE
18e90 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a  CT statements. *
18ea0 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
18eb0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
18ec0 64 65 72 42 79 43 6f 6c 20 3e 20 70 2d 3e 70 45  derByCol > p->pE
18ed0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
18ee0 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d       aPermute[i]
18ef0 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f   = pItem->u.x.iO
18f00 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20  rderByCol - 1;. 
18f10 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72     }.    pKeyMer
18f20 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ge = multiSelect
18f30 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
18f40 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
18f50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
18f60 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
18f70 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
18f80 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
18f90 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
18fa0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
18fb0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
18fc0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
18fd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
18fe0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
18ff0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
19000 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
19010 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
19020 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
19030 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
19040 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
19050 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
19060 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
19070 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
19080 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
19090 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
190a0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
190b0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
190c0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
190d0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
190e0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
190f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19100 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
19110 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
19120 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
19130 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
19140 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19150 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
19160 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
19170 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
19180 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71 6c  nExpr+1;.    sql
19190 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
191a0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
191b0 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70   regPrev);.    p
191c0 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33  KeyDup = sqlite3
191d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
191e0 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20 20   nExpr, 1);.    
191f0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
19200 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
19210 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
19220 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29 20  teable(pKeyDup) 
19230 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
19240 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
19250 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
19260 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
19270 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
19280 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
19290 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
192a0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
192b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
192c0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
192d0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
192e0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
192f0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
19300 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
19310 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f  ior = 0;.  pPrio
19320 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
19330 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
19340 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
19350 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
19360 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
19370 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
19380 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
19390 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
193a0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
193b0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
193c0 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
193d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
193e0 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
193f0 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
19400 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
19410 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
19420 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
19430 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
19440 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
19450 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
19460 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
19470 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
19480 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
19490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
194a0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
194b0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
194c0 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
194d0 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
19500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19510 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
19520 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
19530 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
19540 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
19550 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
19560 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
19570 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19580 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
19590 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
195a0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
195b0 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
195c0 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
195d0 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
195e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
195f0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
19600 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
19610 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
19620 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
19630 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
19640 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
19650 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
19660 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
19670 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
19680 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19690 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
196a0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
196b0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
196c0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
196d0 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
196e0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
196f0 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a  ement to the.  *
19700 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f  * left of the co
19710 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20  mpound operator 
19720 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74  - the "A" select
19730 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  ..  */.  addrSel
19740 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
19750 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
19760 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
19770 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
19780 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
19790 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c  ne, regAddrA, 0,
197a0 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
197b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
197c0 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29   "left SELECT"))
197d0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  ;.  pPrior->iLim
197e0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a  it = regLimitA;.
197f0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
19800 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
19810 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
19820 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
19830 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
19840 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71  r, &destA);.  sq
19850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
19860 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69  v, OP_EndCorouti
19870 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
19880 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19890 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
198a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
198b0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
198c0 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
198d0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
198e0 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
198f0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
19900 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
19910 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19920 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
19930 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
19940 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19950 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
19960 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72  egAddrB, 0, addr
19970 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65  SelectB);.  Vdbe
19980 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67  Comment((v, "rig
19990 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
199a0 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
199b0 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
199c0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
199d0 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
199e0 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
199f0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
19a00 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
19a10 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
19a20 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
19a30 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
19a40 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
19a50 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
19a60 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
19a70 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
19a80 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
19a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19aa0 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
19ab0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
19ac0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19ad0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
19ae0 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
19af0 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
19b00 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
19b10 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
19b20 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
19b30 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
19b40 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
19b50 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
19b60 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
19b70 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
19b80 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
19b90 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
19ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19bb0 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
19bc0 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
19be0 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
19bf0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
19c00 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
19c10 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
19c20 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
19c30 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
19c40 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
19c50 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
19c60 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
19c70 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
19c80 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
19c90 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
19ca0 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
19cb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
19cc0 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
19cd0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
19ce0 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
19cf0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
19d00 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
19d10 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
19d20 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
19d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d40 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
19d50 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
19d60 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
19d70 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
19d80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19d90 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
19da0 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
19db0 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
19dc0 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
19dd0 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
19de0 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
19df0 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
19e00 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43    if( op==TK_EXC
19e10 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
19e20 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
19e30 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64  ddrEofA_noB = ad
19e40 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e  drEofA = labelEn
19e50 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  d;.  }else{  .  
19e60 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
19e70 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
19e80 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
19e90 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
19ea0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19eb0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
19ec0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
19ed0 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d    addrEofA_noB =
19ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ef0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
19f00 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45  regAddrB, labelE
19f10 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
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 56 64 62 65 43 6f            VdbeCo
19f40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
19f50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19f60 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
19f70 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
19f80 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
19f90 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
19fa0 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ow;.  }..  /* Ge
19fb0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
19fc0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
19fd0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
19fe0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
19ff0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1a000 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1a010 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1a020 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1a030 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1a040 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1a050 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1a060 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1a070 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1a080 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1a090 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1a0a0 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1a0b0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1a0c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1a0d0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1a0e0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1a0f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a100 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1a110 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1a120 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1a130 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a140 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1a150 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1a160 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a180 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1a190 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
1a1a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a1b0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1a1c0 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
1a1d0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1a1e0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
1a1f0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1a200 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
1a210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a220 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1a230 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1a240 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1a250 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1a260 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1a270 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1a280 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1a290 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a2a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
1a2b0 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1a2c0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1a2d0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1a2e0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1a2f0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1a300 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1a310 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1a320 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1a330 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1a340 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1a350 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1a360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1a370 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1a380 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1a390 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1a3a0 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1a3b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a3c0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a3d0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1a3e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1a3f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1a410 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29  o, 0, labelCmpr)
1a420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1a430 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1a440 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1a450 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A>B.  */.  VdbeN
1a460 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1a470 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-gt-B subroutin
1a480 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42  e"));.  addrAgtB
1a490 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
1a4a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
1a4b0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1a4c0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1a4d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a4e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a4f0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
1a500 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73  drOutB);.  }.  s
1a510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a520 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1a530 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
1a540 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1a550 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
1a560 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1a570 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
1a580 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1a590 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
1a5a0 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
1a5b0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
1a5c0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1a5d0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
1a5e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a5f0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1a600 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
1a610 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1a620 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
1a630 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1a640 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1a650 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
1a660 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
1a670 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
1a680 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
1a690 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a6a0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a6b0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1a6c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a6d0 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
1a6e0 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
1a6f0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
1a700 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
1a710 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1a720 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
1a730 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
1a740 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
1a750 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1a770 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
1a780 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
1a790 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1a7a0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
1a7b0 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
1a7c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a7d0 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
1a7e0 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
1a7f0 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  tB); VdbeCoverag
1a800 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  e(v);..  /* Jump
1a810 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69   to the this poi
1a820 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74  nt in order to t
1a830 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65  erminate the que
1a840 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ry..  */.  sqlit
1a850 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a860 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  el(v, labelEnd);
1a870 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e  ..  /* Set the n
1a880 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
1a890 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
1a8a0 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
1a8b0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
1a8c0 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
1a8d0 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  t = pPrior;.    
1a8e0 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
1a8f0 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
1a900 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
1a910 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c  .    generateCol
1a920 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
1a930 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
1a940 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  st);.  }..  /* R
1a950 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f  eassembly the co
1a960 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20  mpound query so 
1a970 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
1a980 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  freed correctly.
1a990 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c    ** by the call
1a9a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
1a9b0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
1a9c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
1a9d0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1a9e0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20  ->pPrior);.  }. 
1a9f0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
1aa00 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  ior;.  pPrior->p
1aa10 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a  Next = p;..  /**
1aa20 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73  * TBD:  Insert s
1aa30 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20  ubroutine calls 
1aa40 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  to close cursors
1aa50 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20   on incomplete. 
1aa60 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73   **** subqueries
1aa70 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e   ****/.  explain
1aa80 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
1aa90 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
1aaa0 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74  iSub2, 0);.  ret
1aab0 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
1aac0 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  !=0;.}.#endif..#
1aad0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1aae0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1aaf0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1ab00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
1ab10 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
1ab20 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
1ab30 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
1ab40 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
1ab50 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
1ab60 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
1ab70 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
1ab80 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
1ab90 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
1aba0 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
1abb0 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1abc0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1abd0 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1abe0 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1abf0 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1ac00 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1ac10 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1ac20 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1ac30 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1ac40 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1ac50 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1ac60 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1ac70 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1ac80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ac90 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1aca0 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1acb0 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1acc0 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1acd0 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1ace0 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1acf0 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1ad00 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1ad10 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1ad20 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1ad30 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1ad40 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1ad50 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1ad60 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1ad70 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
1ad80 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
1ad90 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
1ada0 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
1adb0 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
1adc0 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
1add0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1ade0 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
1adf0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
1ae00 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
1ae10 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
1ae20 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
1ae30 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
1ae40 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
1ae50 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
1ae60 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1ae70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
1ae80 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1ae90 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1aea0 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
1aeb0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
1aec0 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
1aed0 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
1aee0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
1aef0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
1af00 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
1af10 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1af20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1af30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1af40 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1af50 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
1af60 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1af70 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1af80 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1af90 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1afa0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1afb0 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
1afc0 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
1afd0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1afe0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1aff0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b000 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
1b010 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
1b020 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
1b030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
1b040 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
1b050 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1b060 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1b070 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1b080 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20  te(db, pExpr);. 
1b090 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65       pExpr = pNe
1b0a0 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  w;.    }.  }else
1b0b0 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  {.    pExpr->pLe
1b0c0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ft = substExpr(d
1b0d0 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  b, pExpr->pLeft,
1b0e0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b0f0 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  ;.    pExpr->pRi
1b100 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  ght = substExpr(
1b110 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
1b120 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1b130 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1b140 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b150 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1b160 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1b170 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
1b180 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  >x.pSelect, iTab
1b190 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
1b1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75   }else{.      su
1b1b0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1b1c0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20  pExpr->x.pList, 
1b1d0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
1b1e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b1f0 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61  urn pExpr;.}.sta
1b200 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
1b210 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
1b220 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
1b230 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
1b240 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
1b250 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1b260 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
1b270 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1b280 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1b290 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
1b2a0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b2b0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
1b2c0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
1b2d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b2e0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
1b2f0 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
1b300 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b310 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1b320 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1b330 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1b340 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  +){.    pList->a
1b350 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73  [i].pExpr = subs
1b360 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d  tExpr(db, pList-
1b370 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
1b380 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b390 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1b3a0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73  substSelect(.  s
1b3b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b3c0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
1b3d0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65  lloc errors here
1b3e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1b3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45             /* SE
1b400 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1b410 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1b420 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f  substitutions */
1b430 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b440 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1b450 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1b460 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b470 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
1b480 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
1b490 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1b4a0 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1b4b0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1b4c0 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1b4d0 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1b4e0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b4f0 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  db, p->pEList, i
1b500 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1b510 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1b520 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c  db, p->pGroupBy,
1b530 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1b540 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
1b550 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  t(db, p->pOrderB
1b560 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
1b570 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67  t);.  p->pHaving
1b580 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
1b590 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
1b5a0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1b5b0 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1b5c0 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
1b5d0 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
1b5e0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
1b5f0 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
1b600 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
1b610 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
1b620 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1b630 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e  pSrc );  /* Even
1b640 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20   for (SELECT 1) 
1b650 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30  we have: pSrc!=0
1b660 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d   but pSrc->nSrc=
1b670 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  =0 */.  if( ALWA
1b680 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20  YS(pSrc) ){.    
1b690 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1b6a0 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1b6b0 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1b6c0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1b6d0 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d  Select(db, pItem
1b6e0 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c  ->pSelect, iTabl
1b6f0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
1b700 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
1b710 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
1b720 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1b730 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1b740 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
1b750 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
1b760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b770 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1b780 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1b790 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EW)./*.** This r
1b7a0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
1b7b0 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75  to flatten subqu
1b7c0 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66 6f  eries as a perfo
1b7d0 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  rmance optimizat
1b7e0 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
1b7f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69  tine returns 1 i
1b800 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
1b810 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
1b820 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73  lattening occurs
1b830 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
1b840 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
1b850 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
1b860 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
1b870 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
1b880 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1b890 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
1b8a0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
1b8b0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
1b8c0 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
1b8d0 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
1b8e0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
1b8f0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
1b900 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
1b910 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
1b920 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
1b930 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
1b940 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
1b950 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
1b960 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
1b970 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
1b980 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
1b990 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
1b9a0 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
1b9b0 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
1b9c0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
1b9d0 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
1b9e0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
1b9f0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
1ba00 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1ba10 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
1ba20 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
1ba30 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1ba40 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
1ba50 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
1ba60 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
1ba70 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
1ba80 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
1ba90 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1baa0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
1bab0 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
1bac0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
1bad0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
1bae0 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69 63  r this simplific
1baf0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
1bb00 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
1bb10 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
1bb20 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
1bb30 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
1bb40 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
1bb50 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
1bb60 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
1bb70 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
1bb80 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
1bb90 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
1bba0 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
1bbb0 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
1bbc0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1bbd0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1bbe0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
1bbf0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1bc00 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1bc10 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
1bc20 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
1bc30 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
1bc40 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1bc50 72 65 67 61 74 65 20 6f 72 20 28 32 61 29 20 74  regate or (2a) t
1bc60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1bc70 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 20  s not a join.** 
1bc80 20 20 20 20 20 20 20 61 6e 64 20 28 32 62 29 20         and (2b) 
1bc90 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1bca0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75 62  does not use sub
1bcb0 71 75 65 72 69 65 73 20 6f 74 68 65 72 20 74 68  queries other th
1bcc0 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a 20 20 20  an the one.**   
1bcd0 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61 75 73 65       FROM-clause
1bce0 20 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69   subquery that i
1bcf0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1bd00 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28  r flattening.  (
1bd10 32 62 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  2b is.**        
1bd20 64 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32  due to ticket [2
1bd30 66 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30  f7170d73bf9abf80
1bd40 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30  ] from 2015-02-0
1bd50 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  9.).**.**   (3) 
1bd60 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1bd70 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   not the right o
1bd80 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
1bd90 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20   outer join.**  
1bda0 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c        (Originall
1bdb0 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20  y ticket #306.  
1bdc0 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20  Strengthened by 
1bdd0 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a  ticket #3300).**
1bde0 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1bdf0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
1be00 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1be10 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1be20 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1be30 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1be40 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1be50 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1be60 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1be70 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1be80 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1be90 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1bea0 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1beb0 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1bec0 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1bed0 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1bee0 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1bef0 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
1bf00 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1bf10 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1bf20 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1bf30 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1bf40 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1bf50 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1bf60 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
1bf70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1bf80 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1bf90 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1bfa0 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1bfb0 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1bfc0 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f  dding a FROM clo
1bfd0 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65 63  se with the spec
1bfe0 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61  ial.**        ta
1bff0 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20  ble sqlite_once 
1c000 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
1c010 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f   a single row co
1c020 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20  ntaining a.**   
1c030 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c       single NULL
1c040 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54  ..**.**   (8)  T
1c050 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c060 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1c070 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1c080 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
1c090 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68  .**.**   (9)  Th
1c0a0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1c0b0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1c0c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1c0d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a   does not use.**
1c0e0 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61 74          aggregat
1c0f0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1c100 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30   Restriction (10
1c110 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72  ) was removed fr
1c120 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32  om the code on 2
1c130 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65  005-02-05 but we
1c140 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64  .**        accid
1c150 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68  ently carried th
1c160 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72  e comment forwar
1c170 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d  d until 2014-09-
1c180 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a  15.  Original.**
1c190 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22 54          text: "T
1c1a0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c1b0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1c1c0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1c1d0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
1c1e0 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
1c1f0 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31  MIT.".**.**  (11
1c200 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1c210 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1c220 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1c230 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1c240 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1c250 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1c260 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1c270 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1c280 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1c290 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1c2a0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1c2b0 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1c2c0 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1c2d0 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1c2e0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1c2f0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1c300 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54  t both use LIMIT
1c310 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54  ..**.**  (14)  T
1c320 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1c330 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
1c340 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68  .**.**  (15)  Th
1c350 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1c360 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63   not part of a c
1c370 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f  ompound select o
1c380 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  r the.**        
1c390 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1c3a0 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63  t have a LIMIT c
1c3b0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
1c3c0 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
1c3d0 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
1c3e0 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
1c3f0 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75  **  (16)  The ou
1c400 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1c410 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1c420 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   the subquery do
1c430 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74  es.**        not
1c440 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
1c450 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34  Y.  (Ticket #294
1c460 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f  2)  This used to
1c470 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20   not matter.**  
1c480 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69        until we i
1c490 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72  ntroduced the gr
1c4a0 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e  oup_concat() fun
1c4b0 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20  ction.  .**.**  
1c4c0 28 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75  (17)  The sub-qu
1c4d0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d  ery is not a com
1c4e0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72  pound select, or
1c4f0 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41   it is a UNION A
1c500 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  LL .**        co
1c510 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61  mpound clause ma
1c520 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f  de up entirely o
1c530 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20  f non-aggregate 
1c540 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a  queries, and .**
1c550 20 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65          the pare
1c560 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  nt query:.**.** 
1c570 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
1c580 74 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66  t itself part of
1c590 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1c5a0 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ct,.**          
1c5b0 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  * is not an aggr
1c5c0 65 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43  egate or DISTINC
1c5d0 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20  T query, and.** 
1c5e0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
1c5f0 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20  t a join.**.**  
1c600 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
1c610 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
1c620 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
1c630 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
1c640 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
1c650 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
1c660 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
1c670 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
1c680 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
1c690 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
1c6a0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54  FSET clauses.  T
1c6b0 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e  he subquery cann
1c6c0 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f  ot use any compo
1c6d0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
1c6e0 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61  erator other tha
1c6f0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61  n UNION ALL beca
1c700 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  use all the othe
1c710 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  r compound.**   
1c720 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68       operators h
1c730 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44  ave an implied D
1c740 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73  ISTINCT which is
1c750 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a   disallowed by.*
1c760 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63  *        restric
1c770 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20  tion (4)..**.** 
1c780 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63         Also, eac
1c790 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74  h component of t
1c7a0 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73  he sub-query mus
1c7b0 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  t return the sam
1c7c0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20  e number.**     
1c7d0 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c     of result col
1c7e0 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63  umns. This is ac
1c7f0 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65  tually a require
1c800 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d  ment for any com
1c810 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1c820 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1c830 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f  , but all the co
1c840 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20  de here does is 
1c850 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e  make sure that n
1c860 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68  o.**        such
1c870 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71   (illegal) sub-q
1c880 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65  uery is flattene
1c890 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
1c8a0 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a  ll detect the.**
1c8b0 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65          syntax e
1c8c0 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20  rror and return 
1c8d0 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61  a detailed messa
1c8e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  ge..**.**  (18) 
1c8f0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1c900 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1c910 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
1c920 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
1c930 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79          ORDER by
1c940 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
1c950 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
1c960 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
1c970 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
1c980 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
1c990 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
1c9a0 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  19)  The subquer
1c9b0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1c9c0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1c9d0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1c9e0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1c9f0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
1ca00 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
1ca10 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1ca20 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1ca30 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
1ca40 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1ca50 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
1ca60 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
1ca70 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
1ca80 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
1ca90 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
1caa0 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
1cab0 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
1cac0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1cad0 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
1cae0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
1caf0 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
1cb00 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
1cb10 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1cb20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
1cb30 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
1cb40 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
1cb50 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
1cb60 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
1cb70 20 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71    (21)  The subq
1cb80 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1cb90 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1cba0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1cbb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
1cbc0 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b  INCT.  (See tick
1cbd0 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29  et [752e1646fc])
1cbe0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54  ..**.**  (22)  T
1cbf0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1cc00 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43  ot a recursive C
1cc10 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20  TE..**.**  (23) 
1cc20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e   The parent is n
1cc30 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 43  ot a recursive C
1cc40 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71  TE, or the sub-q
1cc50 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  uery is not a.**
1cc60 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64          compound
1cc70 20 71 75 65 72 79 2e 20 54 68 69 73 20 72 65 73   query. This res
1cc80 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61  triction is beca
1cc90 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67  use transforming
1cca0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70   the.**        p
1ccb0 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f  arent to a compo
1ccc0 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73  und query confus
1ccd0 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  es the code that
1cce0 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20   handles.**     
1ccf0 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65     recursive que
1cd00 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c  ries in multiSel
1cd10 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  ect()..**.**  (2
1cd20 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1cd30 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1cd40 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
1cd50 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
1cd60 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
1cd70 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
1cd80 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
1cd90 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
1cda0 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
1cdb0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1cdc0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
1cdd0 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
1cde0 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
1cdf0 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
1ce00 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
1ce10 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
1ce20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
1ce30 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  **.**.** In this
1ce40 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
1ce50 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
1ce60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ce70 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
1ce80 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1ce90 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
1cea0 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
1ceb0 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
1cec0 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
1ced0 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
1cee0 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
1cef0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1cf00 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1cf10 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
1cf20 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
1cf30 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
1cf40 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1cf50 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
1cf60 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1cf70 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
1cf80 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1cf90 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
1cfa0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1cfb0 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
1cfc0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
1cfd0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1cfe0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
1cff0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
1d000 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
1d010 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
1d020 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
1d030 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1d040 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1d050 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1d060 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
1d070 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
1d080 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
1d090 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
1d0a0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1d0b0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
1d0c0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
1d0d0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
1d0e0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
1d0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d100 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
1d110 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
1d120 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
1d130 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
1d140 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
1d150 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1d160 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1d170 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
1d180 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
1d190 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
1d1a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1d1b0 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
1d1c0 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20  arent;.  Select 
1d1d0 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
1d1e0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
1d1f0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
1d200 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
1d210 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
1d220 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
1d230 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
1d240 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
1d250 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
1d260 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1d270 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1d280 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1d290 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
1d2a0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1d2b0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1d2c0 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
1d2d0 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
1d2e0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1d2f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d300 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
1d310 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
1d320 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
1d330 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
1d340 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
1d350 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1d360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d370 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
1d380 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
1d390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3a0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1d3b0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1d3c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1d3d0 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
1d3e0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
1d3f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d400 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
1d410 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
1d420 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1d430 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
1d440 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
1d450 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
1d460 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1d470 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
1d480 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
1d490 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
1d4a0 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  s */.  if( Optim
1d4b0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1d4c0 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
1d4d0 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
1d4e0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
1d4f0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
1d500 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
1d510 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
1d520 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
1d530 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
1d540 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
1d550 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
1d560 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
1d570 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1d580 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
1d590 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  ub!=0 );.  if( s
1d5a0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1d5b0 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
1d5c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1d5f0 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f  riction (1)   */
1d600 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1d610 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1d620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d640 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a  triction (2a)  *
1d650 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57  /.    if( (p->pW
1d660 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73 50  here && ExprHasP
1d670 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72  roperty(p->pWher
1d680 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a  e,EP_Subquery)).
1d690 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
1d6a0 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
1d6b0 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75  >pEList) & EP_Su
1d6c0 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20  bquery)!=0.     
1d6d0 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1d6e0 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64  istFlags(p->pOrd
1d6f0 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71 75  erBy) & EP_Subqu
1d700 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ery)!=0.    ){. 
1d710 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1d750 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a  iction (2b)  */.
1d760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20      }.  }.    . 
1d770 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
1d780 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1d790 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a   pSubSrc );.  /*
1d7a0 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f   Prior to versio
1d7b0 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49  n 3.1.2, when LI
1d7c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68  MIT and OFFSET h
1d7d0 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20  ad to be simple 
1d7e0 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20  constants,.  ** 
1d7f0 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78  not arbitrary ex
1d800 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  pressions, we al
1d810 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
1d820 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
1d830 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1d840 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
1d850 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
1d860 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
1d870 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
1d880 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1d890 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
1d8a0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
1d8b0 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
1d8c0 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
1d8d0 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
1d8e0 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
1d8f0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1d900 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
1d910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d920 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d930 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
1d940 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
1d950 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d970 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1d980 34 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  4) */.  if( (p->
1d990 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
1d9a0 6d 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53  mpound)!=0 && pS
1d9b0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
1d9c0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1da00 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20  ction (15) */.  
1da10 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d  }.  if( pSubSrc-
1da20 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  >nSrc==0 ) retur
1da30 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1da40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1da50 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a  striction (7)  *
1da60 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  /.  if( pSub->se
1da70 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1da80 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
1da90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1daa0 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a  striction (5)  *
1dab0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1dac0 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e  imit && (pSrc->n
1dad0 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
1dae0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1daf0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  ;         /* Res
1db00 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29  trictions (8)(9)
1db10 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70   */.  }.  if( (p
1db20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1db30 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20  Distinct)!=0 && 
1db40 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b  subqueryIsAgg ){
1db50 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1db60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1db70 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20  iction (6)  */. 
1db80 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
1db90 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
1dba0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
1dbb0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1dbf0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
1dc00 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
1dc10 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
1dc20 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1dc30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dc40 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
1dc50 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dc60 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
1dc70 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1dc80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1dc90 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
1dca0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1dcb0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
1dcc0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1dcd0 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
1dce0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
1dcf0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
1dd00 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   */.  }.  testca
1dd10 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  se( pSub->selFla
1dd20 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
1dd30 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e );.  testcase(
1dd40 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1dd50 26 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29  & SF_MinMaxAgg )
1dd60 3b 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  ;.  if( pSub->se
1dd70 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63  lFlags & (SF_Rec
1dd80 75 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78  ursive|SF_MinMax
1dd90 41 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Agg) ){.    retu
1dda0 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63  rn 0; /* Restric
1ddb0 74 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28  tions (22) and (
1ddc0 32 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  24) */.  }.  if(
1ddd0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1dde0 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
1ddf0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b   pSub->pPrior ){
1de00 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1de10 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1de20 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  3) */.  }..  /* 
1de30 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54  OBSOLETE COMMENT
1de40 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63   1:.  ** Restric
1de50 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20  tion 3:  If the 
1de60 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f  subquery is a jo
1de70 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
1de80 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20  e subquery is . 
1de90 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20   ** not used as 
1dea0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1deb0 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f  d of an outer jo
1dec0 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66  in.  Examples of
1ded0 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69   why this.  ** i
1dee0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
1def0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1df00 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
1df10 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29  OIN (t2 JOIN t3)
1df20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1df30 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1df40 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1df50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1df60 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1df70 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20  R JOIN t2) JOIN 
1df80 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69  t3.  **.  ** whi
1df90 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  ch is not at all
1dfa0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e   the same thing.
1dfb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c  .  **.  ** OBSOL
1dfc0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20  ETE COMMENT 2:. 
1dfd0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1dfe0 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71  12:  If the subq
1dff0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1e000 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
1e010 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a  eft outer.  ** j
1e020 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
1e030 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1e040 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  no WHERE clause.
1e050 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65  .  ** An example
1e060 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  s of why this is
1e070 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
1e080 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1e090 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1e0a0 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
1e0b0 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e  M t2 WHERE t2.x>
1e0c0 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  0).  **.  ** If 
1e0d0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
1e0e0 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
1e0f0 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
1e100 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
1e110 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45  TER JOIN t2) WHE
1e120 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20  RE t2.x>0.  **. 
1e130 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78   ** But the t2.x
1e140 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77  >0 test will alw
1e150 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55  ays fail on a NU
1e160 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68  LL row of t2, wh
1e170 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69  ich.  ** effecti
1e180 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68  vely converts th
1e190 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74  e OUTER JOIN int
1e1a0 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e  o an INNER JOIN.
1e1b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20  .  **.  ** THIS 
1e1c0 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45  OVERRIDES OBSOLE
1e1d0 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e  TE COMMENTS 1 AN
1e1e0 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20  D 2 ABOVE:.  ** 
1e1f0 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f  Ticket #3300 sho
1e200 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ws that flatteni
1e210 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72  ng the right ter
1e220 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
1e230 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74  .  ** is fraught
1e240 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42   with danger.  B
1e250 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65  est to avoid the
1e260 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49   whole thing.  I
1e270 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  f the.  ** subqu
1e280 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1e290 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1e2a0 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  JOIN, then do no
1e2b0 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a  t flatten..  */.
1e2c0 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
1e2d0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  >jointype & JT_O
1e2e0 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
1e2f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
1e300 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e310 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
1e320 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1e330 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
1e340 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
1e350 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
1e360 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
1e370 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
1e380 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
1e390 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
1e3a0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
1e3b0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
1e3c0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
1e3d0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
1e3e0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
1e3f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
1e400 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1e410 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
1e420 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
1e430 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
1e440 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d  tion 20 */.    }
1e450 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c  .    if( isAgg |
1e460 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  | (p->selFlags &
1e470 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1e480 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d   || pSrc->nSrc!=
1e490 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
1e4a0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 0;.    }.    f
1e4b0 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70  or(pSub1=pSub; p
1e4c0 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62  Sub1; pSub1=pSub
1e4d0 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  1->pPrior){.    
1e4e0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1e4f0 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1e500 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1e510 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1e520 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
1e530 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1e540 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1e550 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1e560 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
1e570 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20  gregate );.     
1e580 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1e590 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Src!=0 );.      
1e5a0 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
1e5b0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1e5c0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1e5d0 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
1e5e0 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
1e5f0 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
1e600 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
1e610 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1e620 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  c<1.       || pS
1e630 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
1e640 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74  r!=pSub1->pEList
1e650 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
1e660 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e670 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1e680 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
1e690 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
1e6a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e6b0 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
1e6c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
1e6d0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1e6e0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
1e6f0 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
1e700 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
1e710 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1e720 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
1e730 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  [ii].u.x.iOrderB
1e740 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  yCol==0 ) return
1e750 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1e760 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
1e770 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
1e780 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
1e790 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1e7a0 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
1e7b0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
1e7c0 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
1e7d0 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
1e7e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e7f0 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
1e800 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
1e810 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
1e820 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
1e830 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
1e840 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
1e850 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
1e860 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
1e870 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1e880 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
1e890 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
1e8a0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
1e8b0 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
1e8c0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1e8d0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
1e8e0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
1e8f0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1e900 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1e910 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1e920 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
1e930 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
1e940 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
1e950 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
1e960 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
1e970 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
1e980 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
1e990 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
1e9a0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
1e9b0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
1e9c0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
1e9d0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
1e9e0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
1e9f0 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
1ea00 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
1ea10 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
1ea20 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
1ea30 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
1ea40 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1ea50 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
1ea60 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
1ea70 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
1ea80 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
1ea90 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
1eaa0 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
1eab0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
1eac0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
1ead0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
1eae0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
1eaf0 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
1eb00 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
1eb10 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1eb20 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
1eb30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
1eb40 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
1eb50 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
1eb60 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
1eb70 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1eb80 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
1eb90 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
1eba0 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
1ebb0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1ebc0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1ebd0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1ebe0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
1ebf0 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
1ec00 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
1ec10 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
1ec20 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
1ec30 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
1ec40 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
1ec50 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
1ec60 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1ec70 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1ec80 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
1ec90 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
1eca0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1ecb0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1ecc0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
1ecd0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
1ece0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
1ecf0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1ed00 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
1ed10 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
1ed20 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1ed30 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
1ed40 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
1ed50 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
1ed60 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
1ed70 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
1ed80 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ed90 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1eda0 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
1edb0 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
1edc0 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  mit;.    Expr *p
1edd0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
1ede0 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  set;.    Select 
1edf0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
1ee00 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
1ee10 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
1ee20 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
1ee30 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
1ee40 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
1ee50 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1ee60 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  = 0;.    pNew = 
1ee70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1ee80 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  (db, p, 0);.    
1ee90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
1eea0 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62 2d  Name(pNew, pSub-
1eeb0 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  >zSelName);.    
1eec0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
1eed0 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  fset;.    p->pLi
1eee0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
1eef0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1ef00 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
1ef10 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
1ef20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
1ef30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1ef40 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
1ef50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1ef60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ef70 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
1ef80 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
1ef90 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
1efa0 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
1efb0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
1efc0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
1efd0 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
1efe0 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
1eff0 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  (2,pParse,p,.   
1f000 20 20 20 20 20 20 28 22 63 6f 6d 70 6f 75 6e 64        ("compound
1f010 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f020 6e 65 72 20 63 72 65 61 74 65 73 20 25 73 2e 25  ner creates %s.%
1f030 70 20 61 73 20 70 65 65 72 5c 6e 22 2c 0a 20 20  p as peer\n",.  
1f040 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 53 65         pNew->zSe
1f050 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20  lName, pNew));. 
1f060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
1f070 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f080 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1f090 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
1f0a0 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
1f0b0 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
1f0c0 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
1f0d0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
1f0e0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
1f0f0 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
1f100 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
1f110 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
1f120 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
1f130 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
1f140 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
1f150 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
1f160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f170 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
1f180 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
1f190 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1f1a0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1f1b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f1c0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
1f1d0 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
1f1e0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1f1f0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
1f200 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
1f210 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1f220 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
1f230 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
1f240 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
1f250 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1f260 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1f270 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1f280 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
1f290 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
1f2a0 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
1f2b0 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
1f2c0 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
1f2d0 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
1f2e0 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
1f2f0 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
1f300 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
1f310 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
1f320 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
1f330 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
1f340 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
1f350 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
1f360 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
1f370 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
1f380 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
1f390 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
1f3a0 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
1f3b0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
1f3c0 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
1f3d0 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
1f3e0 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
1f3f0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1f400 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1f410 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
1f420 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
1f430 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
1f440 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
1f450 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1f460 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
1f470 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
1f480 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
1f490 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
1f4a0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1f4b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
1f4c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
1f4d0 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1f4e0 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
1f4f0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1f500 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
1f510 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
1f520 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
1f530 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
1f540 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
1f550 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
1f560 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
1f570 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
1f580 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1f590 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
1f5a0 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
1f5b0 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
1f5c0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
1f5d0 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
1f5e0 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
1f5f0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1f600 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
1f610 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1f620 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1f630 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1f640 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
1f650 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1f660 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1f670 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1f680 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1f690 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
1f6a0 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
1f6b0 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
1f6c0 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
1f6d0 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
1f6e0 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1f6f0 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1f700 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1f710 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1f720 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1f730 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1f740 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1f750 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1f760 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
1f770 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
1f780 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
1f790 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1f7a0 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1f7b0 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1f7c0 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1f7d0 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1f7e0 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
1f7f0 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1f800 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1f810 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1f820 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
1f830 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
1f840 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1f850 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
1f860 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
1f870 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
1f880 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
1f890 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
1f8a0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1f8b0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1f8c0 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
1f8d0 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1f8e0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
1f8f0 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
1f900 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
1f910 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
1f920 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1f930 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
1f940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1f950 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1f960 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
1f970 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
1f980 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
1f990 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
1f9a0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1f9b0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1f9c0 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
1f9d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1f9e0 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
1f9f0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1fa00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1fa10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fa20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fa30 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1fa40 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
1fa50 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
1fa60 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1fa70 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
1fa80 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
1fa90 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
1faa0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
1fab0 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
1fac0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
1fad0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1fae0 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
1faf0 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
1fb00 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
1fb10 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
1fb20 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
1fb30 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
1fb40 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
1fb50 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
1fb60 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
1fb70 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
1fb80 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
1fb90 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
1fba0 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
1fbb0 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1fbc0 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
1fbd0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1fbe0 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
1fbf0 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
1fc00 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
1fc10 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
1fc20 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
1fc30 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
1fc40 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73  out query to 4 s
1fc50 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c  lots.  The middl
1fc60 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  e.    ** slot is
1fc70 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
1fc80 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
1fc90 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
1fca0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f  r the.    ** two
1fcb0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1fcc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1fcd0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1fce0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
1fcf0 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
1fd00 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1fd10 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1fd20 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1fd30 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
1fd40 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
1fd50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1fd60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1fd70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1fd80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
1fd90 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
1fda0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
1fdb0 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
1fdc0 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
1fdd0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1fde0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1fdf0 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
1fe00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
1fe10 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1fe20 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
1fe30 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70  pUsing);.      p
1fe40 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
1fe50 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
1fe60 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1fe70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
1fe80 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
1fe90 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
1fea0 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
1feb0 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
1fec0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
1fed0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
1fee0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
1fef0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
1ff00 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
1ff10 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
1ff20 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
1ff30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ff40 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1ff50 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1ff60 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1ff70 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1ff80 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1ff90 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1ffa0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1ffb0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
1ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ffd0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
1ffe0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
1fff0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
20000 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
20010 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
20020 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
20030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20040 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
20050 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
20060 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
20070 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
20080 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
20090 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
200a0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
200b0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
200c0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
200d0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
200e0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
200f0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
20100 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
20110 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
20120 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
20130 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
20140 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
20150 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
20160 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
20170 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
20180 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
20190 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
201a0 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
201b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
201c0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
201d0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
201e0 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45      }.    substE
201f0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
20200 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  ent->pEList, iPa
20210 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
20220 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41  st);.    if( isA
20230 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  gg ){.      subs
20240 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
20250 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c  arent->pGroupBy,
20260 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
20270 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
20280 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
20290 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
202a0 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
202b0 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
202c0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
202d0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
202e0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
202f0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
20300 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69  , any non-zero i
20310 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65  OrderByCol value
20320 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
20330 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44  the.      ** ORD
20340 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70  ER BY column exp
20350 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74  ression is ident
20360 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64  ical to the iOrd
20370 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20  erByCol'th.     
20380 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72   ** expression r
20390 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43  eturned by SELEC
203a0 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62  T statement pSub
203b0 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61  . Since these va
203c0 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f  lues.      ** do
203d0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
203e0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63   correspond to c
203f0 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54  olumns in SELECT
20400 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65   statement pPare
20410 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72  nt,.      ** zer
20420 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72  o them before tr
20430 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52  ansfering the OR
20440 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
20450 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
20460 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20   Not doing this 
20470 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72  may cause an err
20480 6f 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65  or if a subseque
20490 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  nt call to this.
204a0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
204b0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  n attempts to fl
204c0 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  atten a compound
204d0 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20   sub-query into 
204e0 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  pParent.      **
204f0 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74   (the only way t
20500 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69  his can happen i
20510 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s if the compoun
20520 64 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20  d sub-query is. 
20530 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c       ** currentl
20540 79 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e  y part of pSub->
20550 70 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65  pSrc). See ticke
20560 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20  t [d11a6e908f]. 
20570 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
20580 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
20590 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
205a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
205b0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
205c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
205d0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e  OrderBy->a[i].u.
205e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
205f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
20600 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
20610 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
20620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20630 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
20640 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
20650 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
20660 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
20670 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
20680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
20690 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
206a0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
206b0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
206c0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50  nt->pOrderBy, iP
206d0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
206e0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
206f0 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65  if( pSub->pWhere
20700 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65   ){.      pWhere
20710 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
20720 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65  p(db, pSub->pWhe
20730 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  re, 0);.    }els
20740 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  e{.      pWhere 
20750 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
20760 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
20770 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20780 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
20790 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
207a0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
207b0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
207c0 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
207d0 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
207e0 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
207f0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
20800 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
20810 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
20820 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
20830 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
20840 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  t->pHaving = sql
20850 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
20860 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
20870 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20890 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
208a0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48  Dup(db, pSub->pH
208b0 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20  aving, 0));.    
208c0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
208d0 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  t->pGroupBy==0 )
208e0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
208f0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
20900 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
20910 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  b, pSub->pGroupB
20920 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  y, 0);.    }else
20930 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
20940 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
20950 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
20960 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74  >pWhere, iParent
20970 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
20980 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
20990 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
209a0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72  ExprAnd(db, pPar
209b0 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68  ent->pWhere, pWh
209c0 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ere);.    }.  . 
209d0 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
209e0 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
209f0 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
20a00 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
20a10 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
20a20 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
20a30 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
20a40 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
20a50 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
20a60 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
20a70 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
20a80 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
20a90 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
20aa0 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
20ab0 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
20ac0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
20ad0 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
20ae0 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
20af0 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
20b00 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
20b10 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
20b20 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
20b30 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
20b40 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
20b50 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
20b60 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
20b70 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
20b80 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
20b90 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
20ba0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
20bb0 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
20bc0 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
20bd0 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
20be0 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
20bf0 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
20c00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
20c10 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
20c20 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
20c30 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
20c40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
20c50 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
20c60 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
20c70 72 69 6e 74 66 28 22 41 66 74 65 72 20 66 6c 61  rintf("After fla
20c80 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 3b 0a 20 20  ttening:\n");.  
20c90 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
20ca0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
20cb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20cc0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
20cd0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
20ce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
20cf0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
20d00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
20d10 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73  W) */../*.** Bas
20d20 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
20d30 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66  ts of the AggInf
20d40 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  o structure indi
20d50 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72  cated by the fir
20d60 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20  st.** argument, 
20d70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  this function ch
20d80 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ecks if the foll
20d90 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
20da0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71  **.**    * the q
20db0 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75  uery contains ju
20dc0 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72  st a single aggr
20dd0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a  egate function,.
20de0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72  **    * the aggr
20df0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
20e00 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f  s either min() o
20e10 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20  r max(), and.** 
20e20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e     * the argumen
20e30 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
20e40 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
20e50 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a   column value..*
20e60 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74  *.** If all of t
20e70 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75  he above are tru
20e80 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52  e, then WHERE_OR
20e90 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
20ea0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a  RE_ORDERBY_MAX.*
20eb0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  * is returned as
20ec0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c   appropriate. Al
20ed0 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  so, *ppMinMax is
20ee0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
20ef0 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66   the .** list of
20f00 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
20f10 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  d to the aggrega
20f20 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  te before return
20f30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ing..**.** Or, i
20f40 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  f the conditions
20f50 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d   above are not m
20f60 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  et, *ppMinMax is
20f70 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
20f80 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
20f90 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65  ORMAL is returne
20fa0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  d..*/.static u8 
20fb0 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49  minMaxQuery(AggI
20fc0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45  nfo *pAggInfo, E
20fd0 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
20fe0 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
20ff0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
21000 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20  NORMAL;         
21010 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
21020 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78   */..  *ppMinMax
21030 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67   = 0;.  if( pAgg
21040 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29  Info->nFunc==1 )
21050 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
21060 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  r = pAggInfo->aF
21070 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a  unc[0].pExpr; /*
21080 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
21090 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  ion */.    ExprL
210a0 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45  ist *pEList = pE
210b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
210c0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
210d0 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
210e0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
210f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
21100 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
21110 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
21120 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
21130 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
21140 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  .pExpr->op==TK_A
21150 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
21160 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
21170 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e  Func = pExpr->u.
21180 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66  zToken;.      if
21190 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
211a0 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
211b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
211c0 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
211d0 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MIN;.        *
211e0 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
211f0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
21200 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
21210 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
21220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
21230 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
21240 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  BY_MAX;.        
21250 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
21260 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
21270 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
21280 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c   *ppMinMax==0 ||
21290 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45   (*ppMinMax)->nE
212a0 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  xpr==1 );.  retu
212b0 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
212c0 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
212d0 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
212e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
212f0 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
21300 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
21310 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
21320 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
21330 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
21340 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
21350 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
21360 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
21370 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
21380 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
21390 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
213a0 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
213b0 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
213c0 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
213d0 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
213e0 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
213f0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
21400 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
21410 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
21420 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
21430 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
21440 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
21450 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
21460 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21470 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
21480 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
21490 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
214a0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
214b0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
214c0 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
214d0 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
214e0 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
214f0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
21500 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
21510 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
21520 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
21530 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
21540 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
21550 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
21560 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
21570 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
21580 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
21590 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
215a0 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
215b0 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
215c0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
215d0 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
215e0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
215f0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
21600 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
21610 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
21620 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
21630 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
21640 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
21650 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
21660 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
21670 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
21680 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
21690 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
216a0 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
216b0 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
216c0 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
216d0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
216e0 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
216f0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
21700 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
21710 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
21720 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
21730 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
21740 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
21750 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
21760 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
21770 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
21780 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
21790 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
217a0 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
217b0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
217c0 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
217d0 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
217e0 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
217f0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
21800 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
21810 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
21820 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
21830 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21840 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
21850 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
21860 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
21870 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
21880 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
21890 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
218a0 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
218b0 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
218c0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
218d0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
218e0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
218f0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
21900 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
21910 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
21920 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
21930 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
21940 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
21950 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21960 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
21970 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
21980 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  ex, 0);.      pP
21990 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
219a0 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  a = 1;.      ret
219b0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
219c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
219d0 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
219e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
219f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
21a00 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e  * Detect compoun
21a10 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
21a20 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e 20  nts that use an 
21a30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
21a40 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65  with .** an alte
21a50 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e  rnative collatin
21a60 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
21a70 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20  *    SELECT ... 
21a80 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
21a90 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
21aa0 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f  2 ORDER BY .. CO
21ab0 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
21ac0 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69 74  These are rewrit
21ad0 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65 72  ten as a subquer
21ae0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  y:.**.**    SELE
21af0 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
21b00 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
21b10 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
21b20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20  FROM t2).**     
21b30 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c  ORDER BY ... COL
21b40 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  LATE ....**.** T
21b50 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
21b60 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  on is necessary 
21b70 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74  because the mult
21b80 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
21b90 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76   routine.** abov
21ba0 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 73  e that generates
21bb0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
21bc0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
21bd0 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  with an ORDER BY
21be0 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20   clause.** uses 
21bf0 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  a merge algorith
21c00 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  m that requires 
21c10 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
21c20 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74  ng sequence on t
21c30 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c  he.** result col
21c40 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f  umns as on the O
21c50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
21c60 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68   See ticket.** h
21c70 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  ttp://www.sqlite
21c80 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37  .org/src/info/67
21c90 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54  09574d2a.**.** T
21ca0 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
21cb0 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65  on is only neede
21cc0 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e  d for EXCEPT, IN
21cd0 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49  TERSECT, and UNI
21ce0 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e  ON..** The UNION
21cf0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f   ALL operator wo
21d00 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75  rks fine with mu
21d10 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
21d20 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20  () even when.** 
21d30 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54  there are COLLAT
21d40 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f  E terms in the O
21d50 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74  RDER BY..*/.stat
21d60 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f  ic int convertCo
21d70 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
21d80 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70  bquery(Walker *p
21d90 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
21da0 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  p){.  int i;.  S
21db0 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53  elect *pNew;.  S
21dc0 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c  elect *pX;.  sql
21dd0 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75  ite3 *db;.  stru
21de0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
21df0 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   *a;.  SrcList *
21e00 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65  pNewSrc;.  Parse
21e10 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65   *pParse;.  Toke
21e20 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20  n dummy;..  if( 
21e30 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72  p->pPrior==0 ) r
21e40 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
21e50 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72  ue;.  if( p->pOr
21e60 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
21e70 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
21e80 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26    for(pX=p; pX &
21e90 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  & (pX->op==TK_AL
21ea0 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  L || pX->op==TK_
21eb0 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e  SELECT); pX=pX->
21ec0 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20  pPrior){}.  if( 
21ed0 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  pX==0 ) return W
21ee0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61  RC_Continue;.  a
21ef0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
21f00 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f  a;.  for(i=p->pO
21f10 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b  rderBy->nExpr-1;
21f20 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
21f30 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d   if( a[i].pExpr-
21f40 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
21f50 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ate ) break;.  }
21f60 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74  .  if( i<0 ) ret
21f70 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
21f80 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  ;..  /* If we re
21f90 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
21fa0 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74  that means the t
21fb0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
21fc0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20   required. */.. 
21fd0 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
21fe0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  r->pParse;.  db 
21ff0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22000 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
22010 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
22020 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
22030 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
22040 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22050 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d  ;.  memset(&dumm
22060 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d  y, 0, sizeof(dum
22070 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20  my));.  pNewSrc 
22080 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
22090 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
220a0 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d  Parse,0,0,0,&dum
220b0 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20  my,pNew,0,0);.  
220c0 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29  if( pNewSrc==0 )
220d0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
220e0 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b  t;.  *pNew = *p;
220f0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65  .  p->pSrc = pNe
22100 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73  wSrc;.  p->pELis
22110 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
22120 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
22130 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72  , 0, sqlite3Expr
22140 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 29  (db, TK_ALL, 0))
22150 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53  ;.  p->op = TK_S
22160 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65  ELECT;.  p->pWhe
22170 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  re = 0;.  pNew->
22180 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
22190 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
221a0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  0;.  pNew->pOrde
221b0 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50  rBy = 0;.  p->pP
221c0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rior = 0;.  p->p
221d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  Next = 0;.  p->p
221e0 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73  With = 0;.  p->s
221f0 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43  elFlags &= ~SF_C
22200 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72  ompound;.  asser
22210 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
22220 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d  & SF_Converted)=
22230 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c  =0 );.  p->selFl
22240 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72  ags |= SF_Conver
22250 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ted;.  assert( p
22260 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29  New->pPrior!=0 )
22270 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72  ;.  pNew->pPrior
22280 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
22290 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
222a0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66   0;.  pNew->pOff
222b0 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  set = 0;.  retur
222c0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
222d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
222e0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
222f0 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
22300 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
22310 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
22320 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
22330 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
22340 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
22350 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
22360 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
22370 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
22380 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
22390 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
223a0 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
223b0 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
223c0 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
223d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
223e0 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
223f0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
22400 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
22410 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
22420 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
22430 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
22440 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
22450 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
22460 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
22470 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
22480 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
22490 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
224a0 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
224b0 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
224c0 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
224d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
224e0 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57  rent outermost W
224f0 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
22500 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22510 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
22520 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
22530 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
22540 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
22550 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
22560 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
22570 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
22580 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
22590 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
225a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
225b0 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
225c0 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
225d0 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
225e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
225f0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
22600 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
22610 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
22620 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
22630 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
22640 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
22650 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22660 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
22670 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
22680 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
22690 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
226a0 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
226b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
226c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
226d0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
226e0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
226f0 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
22700 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
22710 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
22720 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
22730 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
22740 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
22750 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
22760 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
22770 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
22780 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
22790 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
227a0 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
227b0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
227c0 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
227d0 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
227e0 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
227f0 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
22800 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
22810 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
22820 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
22830 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
22840 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
22850 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
22860 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
22870 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
22880 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
22890 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
228a0 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
228b0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
228c0 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
228d0 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
228e0 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
228f0 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
22900 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
22910 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
22920 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
22930 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
22940 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  0 );.  if( pWith
22950 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   ){.    pWith->p
22960 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
22970 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
22980 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
22990 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46  ;.    pParse->bF
229a0 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b  reeWith = bFree;
229b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
229c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
229d0 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
229e0 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
229f0 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
22a00 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
22a10 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
22a20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
22a30 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
22a40 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
22a50 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
22a60 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
22a70 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
22a80 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
22a90 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
22aa0 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
22ab0 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
22ac0 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
22ad0 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
22ae0 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
22af0 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
22b00 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
22b10 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
22b20 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
22b30 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
22b40 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
22b50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
22b60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
22b70 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
22b80 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
22b90 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
22ba0 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
22bb0 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
22bc0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
22bd0 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
22be0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
22bf0 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
22c00 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
22c10 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
22c20 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
22c30 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
22c40 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
22c50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22c60 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
22c70 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
22c80 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
22c90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
22ca0 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
22cb0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
22cc0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
22cd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22ce0 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
22cf0 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
22d00 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
22d10 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
22d20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
22d30 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
22d60 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
22d70 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
22d80 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
22d90 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
22da0 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
22db0 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
22dc0 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
22dd0 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
22de0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
22df0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
22e00 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
22e10 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
22e20 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
22e30 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
22e40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22e50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
22e60 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
22e70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22e80 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
22e90 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
22ea0 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
22eb0 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
22ec0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
22ed0 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
22ee0 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
22ef0 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20  * If pCte->zErr 
22f00 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74  is non-NULL at t
22f10 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
22f20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67  this is an illeg
22f30 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73  al.    ** recurs
22f40 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ive reference to
22f50 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65   CTE pCte. Leave
22f60 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
22f70 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  rse and return. 
22f80 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20     ** early. If 
22f90 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55  pCte->zErr is NU
22fa0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  LL, then this is
22fb0 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
22fc0 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20   reference..    
22fd0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
22fe0 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20   proceed.  */.  
22ff0 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72    if( pCte->zErr
23000 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23020 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43  , pCte->zErr, pC
23030 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23050 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
23060 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
23070 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
23080 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
23090 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
230a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
230b0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
230c0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
230d0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
230e0 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  .    pTab->nRef 
230f0 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
23100 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
23110 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
23120 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
23130 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
23140 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
23150 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
23160 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
23170 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
23180 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
23190 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
231a0 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  eral;.    pFrom-
231b0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
231c0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
231d0 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
231e0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
231f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
23200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23210 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  M;.    assert( p
23220 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b  From->pSelect );
23230 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
23240 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75  f this is a recu
23250 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20  rsive CTE. */.  
23260 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e    pSel = pFrom->
23270 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61  pSelect;.    bMa
23280 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70  yRecursive = ( p
23290 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  Sel->op==TK_ALL 
232a0 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f  || pSel->op==TK_
232b0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  UNION );.    if(
232c0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
232d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
232e0 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
232f0 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  rc = pFrom->pSel
23300 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20  ect->pSrc;.     
23310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
23320 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
23330 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
23340 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23350 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a   = &pSrc->a[i];.
23360 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
23370 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
23380 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74  .         && pIt
23390 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20  em->zName!=0 .  
233a0 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
233b0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65  ite3StrICmp(pIte
233c0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e  m->zName, pCte->
233d0 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  zName).         
233e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
233f0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  tem->pTab = pTab
23400 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
23410 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d  m->isRecursive =
23420 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
23430 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
23440 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
23450 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
23460 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
23470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
23480 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
23490 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
234a0 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
234b0 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
234c0 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20  b->nRef>2 ){.   
234d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
234e0 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
234f0 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
23500 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
23510 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
23520 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
23530 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
23540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23550 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
23560 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66  sert( pTab->nRef
23570 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
23580 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
23590 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
235a0 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20  Ref==2 ));..    
235b0 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69  pCte->zErr = "ci
235c0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
235d0 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
235e0 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
235f0 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
23600 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
23610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
23620 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
23630 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f   bMayRecursive ?
23640 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
23650 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pSel);..    for(
23660 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
23670 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
23680 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
23690 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
236a0 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
236b0 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
236c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
236d0 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
236e0 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
236f0 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
23700 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23710 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
23720 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
23730 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
23740 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
23750 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
23760 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
23770 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
23780 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
23790 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
237a0 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
237b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
237c0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
237d0 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
237e0 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
237f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65  .    }..    sele
23800 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
23810 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
23820 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
23830 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
23840 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
23850 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
23860 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  if( pSel->selFla
23870 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
23880 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  e ){.        pCt
23890 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69  e->zErr = "multi
238a0 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
238b0 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
238c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
238d0 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
238e0 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
238f0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
23900 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
23910 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
23920 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
23930 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
23940 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d      pCte->zErr =
23950 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
23960 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
23970 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
23980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
23990 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
239a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
239b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
239c0 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
239d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
239e0 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
239f0 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
23a00 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
23a10 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
23a20 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
23a30 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
23a40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23a50 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
23a60 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
23a70 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
23a80 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
23a90 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
23aa0 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
23ab0 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
23ac0 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
23ad0 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
23ae0 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
23af0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
23b00 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
23b10 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
23b20 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
23b30 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
23b40 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69  er->pParse;.  Wi
23b50 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
23b60 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
23b70 69 74 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ith;.  if( pWith
23b80 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
23b90 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
23ba0 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  ==pWith );.    p
23bb0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
23bc0 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20  With->pOuter;.  
23bd0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
23be0 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
23bf0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
23c00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
23c10 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
23c20 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
23c30 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
23c40 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
23c50 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
23c60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
23c70 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
23c80 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
23c90 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
23ca0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
23cb0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
23cc0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
23cd0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
23ce0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
23cf0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
23d00 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
23d10 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
23d20 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
23d30 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
23d40 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
23d50 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
23d60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
23d70 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
23d80 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
23d90 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
23da0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
23db0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
23dc0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
23dd0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
23de0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
23df0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
23e00 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
23e10 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
23e20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
23e30 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
23e40 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
23e50 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
23e60 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
23e70 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
23e80 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
23e90 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
23ea0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
23eb0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
23ec0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
23ed0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
23ee0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
23ef0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
23f00 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
23f10 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
23f20 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
23f30 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
23f40 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
23f50 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
23f60 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
23f70 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
23f80 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
23f90 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
23fa0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
23fb0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
23fc0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
23fd0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
23fe0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
23ff0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
24000 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
24010 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
24020 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
24030 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
24040 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
24050 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
24060 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
24070 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
24080 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
24090 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
240a0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
240b0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
240c0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
240d0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
240e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
240f0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
24100 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24110 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
24120 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
24130 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
24140 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
24150 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
24160 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
24170 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24180 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
24190 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
241a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
241b0 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
241c0 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
241d0 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
241e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
241f0 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
24200 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
24210 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
24220 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 57 61 6c  List;.  if( pWal
24230 6b 65 72 2d 3e 78 53 65 6c 65 63 74 43 61 6c 6c  ker->xSelectCall
24240 62 61 63 6b 32 3d 3d 73 65 6c 65 63 74 50 6f 70  back2==selectPop
24250 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  With ){.    sqli
24260 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
24270 73 65 2c 20 66 69 6e 64 52 69 67 68 74 6d 6f 73  se, findRightmos
24280 74 28 70 29 2d 3e 70 57 69 74 68 2c 20 30 29 3b  t(p)->pWith, 0);
24290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
242a0 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
242b0 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
242c0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
242d0 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
242e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
242f0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
24300 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
24310 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
24320 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
24330 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
24340 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
24350 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
24360 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
24370 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
24380 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
24390 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
243a0 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
243b0 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
243c0 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
243d0 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
243e0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
243f0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
24400 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
24410 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
24420 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
24430 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
24440 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
24450 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
24460 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
24470 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52  sert( pFrom->isR
24480 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
24490 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20  From->pTab );.  
244a0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52    if( pFrom->isR
244b0 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
244c0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72  nue;.    if( pFr
244d0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
244e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
244f0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
24500 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
24510 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
24520 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
24530 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
24540 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
24550 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
24560 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
24570 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68     selectPopWith
24580 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65  (pWalker, p);.#e
24590 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
245a0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
245b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
245c0 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
245d0 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
245e0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
245f0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24600 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
24610 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
24620 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
24630 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
24640 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
24650 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
24660 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
24670 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
24680 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
24690 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
246a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
246b0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
246c0 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
246d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
246e0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
246f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   );.      if( sq
24700 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
24710 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29  pWalker, pSel) )
24720 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24730 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  t;.      pFrom->
24740 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
24750 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
24760 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
24770 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le));.      if( 
24780 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
24790 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
247a0 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
247b0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
247c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
247d0 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
247e0 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
247f0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
24800 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
24810 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
24820 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
24830 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
24840 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
24850 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
24860 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
24870 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
24880 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
24890 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
248a0 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
248b0 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
248c0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
248d0 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70  8576) );.      p
248e0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
248f0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23   TF_Ephemeral;.#
24900 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
24910 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64  .      /* An ord
24920 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76  inary table or v
24930 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  iew name in the 
24940 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
24950 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
24960 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
24970 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
24980 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
24990 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
249a0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f  (pParse, 0, pFro
249b0 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  m);.      if( pT
249c0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
249d0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
249e0 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d  if( pTab->nRef==
249f0 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  0xffff ){.      
24a00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24a10 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
24a20 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74  any references t
24a30 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35  o \"%s\": max 65
24a40 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20  535",.          
24a50 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
24a60 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54         pFrom->pT
24a70 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
24a80 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24aa0 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
24ab0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
24ac0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
24ad0 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
24ae0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
24af0 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
24b00 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
24b10 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
24b20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
24b30 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
24b40 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
24b50 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
24b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
24b70 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
24b80 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
24b90 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
24ba0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
24bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
24bc0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
24bd0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
24be0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
24bf0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
24c00 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
24c10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24c20 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
24c30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
24c40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
24c50 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
24c60 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
24c70 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
24c80 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
24c90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
24ca0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
24cb0 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
24cc0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
24cd0 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
24ce0 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
24cf0 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
24d00 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
24d10 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24d20 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
24d30 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
24d40 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
24d50 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
24d60 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
24d70 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
24d80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
24d90 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
24da0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
24db0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
24dc0 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
24dd0 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
24de0 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
24df0 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
24e00 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
24e10 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
24e20 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
24e30 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
24e40 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
24e50 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
24e60 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
24e70 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
24e80 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
24e90 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
24ea0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
24eb0 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66  K_ALL operator f
24ec0 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
24ed0 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
24ee0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20   column list..  
24ef0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24f00 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74   code just has t
24f10 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f  o locate the TK_
24f20 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ALL expressions 
24f30 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20  and expand.  ** 
24f40 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20  each one to the 
24f50 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  list of all colu
24f60 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
24f70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
24f80 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
24f90 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
24fa0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
24fb0 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
24fc0 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
24fd0 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
24fe0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
24ff0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
25000 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
25010 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
25020 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
25030 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  LL ) break;.    
25040 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
25050 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
25060 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
25070 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
25080 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
25090 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
250a0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
250b0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
250c0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
250d0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
250e0 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ALL ) break;.  }
250f0 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d  .  if( k<pEList-
25100 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a  >nExpr ){.    /*
25110 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65  .    ** If we ge
25120 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20  t here it means 
25130 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
25140 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
25150 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f  ore "*".    ** o
25160 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65  perators that ne
25170 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
25180 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  d.  Loop through
25190 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
251a0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  .    ** in the r
251b0 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78  esult set and ex
251c0 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79  pand them one by
251d0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   one..    */.   
251e0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
251f0 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73  _item *a = pELis
25200 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69  t->a;.    ExprLi
25210 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  st *pNew = 0;.  
25220 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50    int flags = pP
25230 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b  arse->db->flags;
25240 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d  .    int longNam
25250 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  es = (flags & SQ
25260 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
25270 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  s)!=0.          
25280 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
25290 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
252a0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30  hortColNames)==0
252b0 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70  ;..    /* When p
252c0 72 6f 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63  rocessing FROM-c
252d0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
252e0 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 74  , it is always t
252f0 68 65 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74  he case.    ** t
25300 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  hat full_column_
25310 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68  names=OFF and sh
25320 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73  ort_column_names
25330 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  =ON.  The.    **
25340 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
25350 74 4f 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74  tOfSelect() rout
25360 69 6e 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e  ine makes it so.
25370 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25380 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
25390 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
253a0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  .          || ((
253b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
253c0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20  ullColNames)==0 
253d0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
253e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
253f0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
25400 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  =0) );..    for(
25410 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
25420 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
25430 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70    pE = a[k].pExp
25440 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  r;.      pRight 
25450 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
25460 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
25470 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
25480 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
25490 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
254a0 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d  ALL && (pE->op!=
254b0 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
254c0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b  ->op!=TK_ALL) ){
254d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
254e0 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
254f0 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
25500 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
25510 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
25520 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
25530 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
25540 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
25550 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
25560 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
25570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
25580 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
25590 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
255a0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
255b0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
255c0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
255d0 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
255e0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
255f0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
25600 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
25610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25620 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
25630 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
25640 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
25650 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
25660 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
25670 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
25680 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
25690 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
256a0 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
256b0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
256c0 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
256d0 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
256e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
256f0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
25700 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
25710 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
25720 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
25730 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
25740 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
25750 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
25760 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
25770 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
25780 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
25790 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
257a0 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
257b0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
257c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
257d0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
257e0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
257f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
25800 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
25810 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
25820 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
25830 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
25840 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
25850 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
25860 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
25870 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
25880 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
25890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
258a0 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
258b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
258c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
258d0 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
258e0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
258f0 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
25900 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25910 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
25920 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
25930 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
25940 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
25950 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
25960 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
25970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25980 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
25990 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
259a0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
259b0 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
259c0 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
259d0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
259e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
259f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
25a00 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
25a10 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
25a20 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
25a30 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
25a40 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
25a50 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
25a60 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
25a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25a80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
25a90 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
25aa0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
25ab0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
25ac0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
25ad0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
25ae0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
25af0 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
25b00 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
25b10 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
25b20 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
25b30 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
25b40 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
25b50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
25b60 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
25b70 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
25b80 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
25b90 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
25ba0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
25bb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25bc0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
25bd0 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
25be0 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
25bf0 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
25c00 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
25c10 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
25c20 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
25c30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25c40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25c50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
25c60 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
25c70 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
25c80 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
25c90 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
25ca0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
25cb0 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
25cc0 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
25cd0 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
25ce0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
25cf0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
25d00 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
25d10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25d20 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
25d30 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
25d40 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
25d50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
25d60 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
25d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
25d80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
25d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25da0 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
25db0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
25dc0 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
25dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25de0 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
25df0 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  >jointype & JT_N
25e00 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20  ATURAL)!=0.     
25e10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74 61             && ta
25e20 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
25e30 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a  x(pTabList, i, z
25e40 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20  Name, 0, 0).    
25e50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25e70 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
25e80 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
25e90 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
25ea0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
25eb0 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74     ** table to t
25ec0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
25ed0 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  join */.        
25ee0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
25ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25f00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
25f10 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
25f20 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55  tIndex(pFrom->pU
25f30 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
25f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25f50 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
25f60 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
25f70 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
25f80 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
25f90 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
25fa0 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
25fb0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
25fc0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
25fd0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
25fe0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
25ff0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
26000 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
26010 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
26020 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61  r(db, TK_ID, zNa
26030 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
26040 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d   zColname = zNam
26050 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  e;.            z
26060 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  ToFree = 0;.    
26070 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
26080 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
26090 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
260a0 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
260b0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  *pLeft;.        
260c0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71        pLeft = sq
260d0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
260e0 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a  _ID, zTabName);.
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
26100 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
26110 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
26120 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
26130 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26140 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
26150 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
26160 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
26170 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
26180 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
26190 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
261a0 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
261b0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
261c0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
261d0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
261e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
261f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
26200 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
26210 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
26220 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
26230 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
26240 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
26250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26260 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
26270 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
26280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
262a0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
262b0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
262c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
262d0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
262e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
262f0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
26300 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
26310 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43   sColname.z = zC
26320 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  olname;.        
26330 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d      sColname.n =
26340 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
26350 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20  (zColname);.    
26360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26370 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
26380 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
26390 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
263a0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
263b0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
263c0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
263d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
263e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
263f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
26400 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
26410 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
26420 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
26430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26440 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
26450 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
26460 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
26470 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
26480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
26490 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
264a0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
264b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
264d0 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
264e0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
264f0 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26520 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
26530 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
26540 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
26550 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26560 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
26590 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
265a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
265b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
265c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
265d0 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
265e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
265f0 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
26600 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
26610 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
26620 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26630 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
26640 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
26650 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
26660 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26670 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
26680 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26690 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
266a0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
266b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
266c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
266d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
266e0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
266f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
26700 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
26710 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
26720 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
26730 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
26740 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
26750 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
26760 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
26770 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
26780 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
26790 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
267a0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
267b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
267c0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
267d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70  ;.}../*.** No-op
267e0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
267f0 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b   parse-tree walk
26800 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  er..**.** When t
26810 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
26820 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  he Walker.xExprC
26830 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70  allback then exp
26840 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a  ression trees.**
26850 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68   are walked with
26860 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20  out any actions 
26870 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65  being taken at e
26880 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75  ach node.  Presu
26890 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74  mably,.** when t
268a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
268b0 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78  sed for Walker.x
268c0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
268d0 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65  n .** Walker.xSe
268e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20  lectCallback is 
268f0 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68  set to do someth
26900 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65  ing useful for e
26910 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72  very .** subquer
26920 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20  y in the parser 
26930 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
26940 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  int exprWalkNoop
26950 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
26960 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32  , Expr *NotUsed2
26970 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
26980 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
26990 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
269a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
269b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
269c0 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
269d0 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
269e0 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
269f0 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
26a00 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
26a10 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
26a20 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
26a30 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
26a40 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
26a50 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
26a60 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
26a70 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
26a80 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
26a90 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
26aa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
26ab0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
26ac0 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
26ad0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
26ae0 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
26af0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
26b00 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
26b10 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
26b20 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
26b30 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
26b40 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
26b50 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
26b60 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
26b70 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
26b80 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
26b90 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
26ba0 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
26bb0 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
26bc0 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
26bd0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
26be0 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
26bf0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
26c00 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
26c10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
26c20 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
26c30 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
26c40 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
26c50 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
26c60 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
26c70 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
26c80 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
26c90 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
26ca0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
26cb0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
26cc0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
26cd0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
26ce0 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
26cf0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
26d00 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
26d10 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
26d20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
26d30 3b 0a 20 20 69 66 28 20 28 70 53 65 6c 65 63 74  ;.  if( (pSelect
26d40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
26d50 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 29  MultiValue)==0 )
26d60 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
26d70 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
26d80 74 50 6f 70 57 69 74 68 3b 0a 20 20 7d 0a 20 20  tPopWith;.  }.  
26d90 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
26da0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
26db0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
26dc0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
26dd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
26de0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
26df0 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b  allback callback
26e00 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33   for the sqlite3
26e10 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29  SelectTypeInfo()
26e20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
26e30 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52  *.** For each FR
26e40 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
26e50 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a  ry, add Column.z
26e60 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e  Type and Column.
26e70 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  zColl.** informa
26e80 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c  tion to the Tabl
26e90 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
26ea0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
26eb0 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66  result set.** of
26ec0 20 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a   that subquery..
26ed0 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  **.** The Table 
26ee0 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
26ef0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
26f00 73 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e  sult set was con
26f10 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73  structed.** by s
26f20 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20  electExpander() 
26f30 62 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  but the type and
26f40 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
26f50 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74  mation was omitt
26f60 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f  ed.** at that po
26f70 69 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e  int because iden
26f80 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20  tifiers had not 
26f90 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  yet been resolve
26fa0 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  d.  This.** rout
26fb0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
26fc0 74 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72  ter identifier r
26fd0 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
26fe0 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
26ff0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
27000 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  nfo(Walker *pWal
27010 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
27020 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27030 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63  ;.  int i;.  Src
27040 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
27050 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27060 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20  _item *pFrom;.. 
27070 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46   assert( p->selF
27080 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
27090 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ed );.  if( (p->
270a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
270b0 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b  sTypeInfo)==0 ){
270c0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
270d0 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
270e0 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20 3d  fo;.    pParse =
270f0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
27100 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
27110 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f   p->pSrc;.    fo
27120 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
27130 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
27140 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
27150 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
27160 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27170 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27180 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 54 61    if( ALWAYS(pTa
27190 62 21 3d 30 29 20 26 26 20 28 70 54 61 62 2d 3e  b!=0) && (pTab->
271a0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
271b0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
271c0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
271d0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
271e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
271f0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
27200 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
27210 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
27220 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20         if( pSel 
27230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
27240 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
27250 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
27260 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
27270 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
27280 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
27290 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
272a0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  pSel);.        }
272b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
272c0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
272d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
272e0 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61   adds datatype a
272f0 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nd collating seq
27300 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  uence informatio
27310 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c  n to.** the Tabl
27320 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20  e structures of 
27330 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
27340 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a  subqueries in a.
27350 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
27360 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ent..**.** Use t
27370 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65  his routine afte
27380 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
27390 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
273a0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
273b0 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65  ddTypeInfo(Parse
273c0 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
273d0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e   *pSelect){.#ifn
273e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
273f0 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65  SUBQUERY.  Walke
27400 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
27410 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
27420 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
27430 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64  back2 = selectAd
27440 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
27450 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  o;.  w.xExprCall
27460 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
27470 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
27480 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
27490 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
274a0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
274b0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
274c0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
274d0 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
274e0 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
274f0 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
27500 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
27510 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
27520 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
27530 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
27540 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
27550 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
27560 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
27570 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
27580 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
27590 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
275a0 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
275b0 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
275c0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
275d0 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
275e0 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
275f0 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
27600 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
27610 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
27620 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
27630 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
27640 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
27650 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
27660 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
27670 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27680 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
27690 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
276a0 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
276b0 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
276c0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
276d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
276e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
276f0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
27700 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
27710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27720 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
27730 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
27740 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
27750 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
27760 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
27770 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
27780 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27790 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
277a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
277b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
277c0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
277d0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
277e0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
277f0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
27800 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
27810 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
27820 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
27830 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
27840 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
27850 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
27860 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
27870 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
27880 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
27890 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
278a0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
278b0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
278c0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
278d0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
278e0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
278f0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
27900 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
27910 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
27920 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
27930 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
27940 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
27950 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
27960 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
27970 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
27980 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
27990 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
279a0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
279b0 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
279c0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
279d0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
279e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
279f0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
27a00 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
27a10 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
27a20 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
27a30 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
27a40 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
27a50 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
27a60 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
27a70 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
27a80 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
27a90 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
27aa0 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
27ab0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
27ac0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
27ad0 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
27ae0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
27af0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
27b00 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
27b10 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
27b20 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
27b30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
27b40 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
27b50 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
27b60 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
27b70 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
27b80 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
27b90 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
27ba0 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
27bb0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
27bc0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
27bd0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
27be0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
27bf0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
27c00 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
27c10 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
27c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
27c30 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
27c40 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
27c50 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
27c60 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
27c70 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
27c80 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
27c90 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
27ca0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
27cb0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
27cc0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
27cd0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
27ce0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
27cf0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
27d00 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
27d10 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
27d20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
27d30 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
27d40 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
27d50 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
27d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
27d70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
27d80 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
27d90 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
27da0 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
27db0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
27dc0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
27dd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27de0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
27df0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
27e00 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
27e10 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
27e20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
27e30 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
27e40 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
27e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27e60 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
27e70 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
27e80 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
27e90 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
27ea0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
27eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
27ec0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
27ed0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
27ee0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
27f10 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
27f20 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
27f30 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
27f40 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
27f50 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
27f60 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
27f70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
27f80 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
27f90 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
27fa0 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
27fb0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
27fc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
27fd0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
27fe0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
27ff0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
28000 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
28010 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
28020 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
28030 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
28040 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
28050 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
28060 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
28070 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
28080 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
28090 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
280a0 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
280b0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
280c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
280d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
280e0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
280f0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
28100 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
28130 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
28140 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
28150 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
28160 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
28170 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
28180 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
28190 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
281a0 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
281b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
281c0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
281d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
281e0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
281f0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
28200 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
28210 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
28220 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
28230 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
28240 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
28250 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
28260 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
28270 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
28280 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
28290 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
282a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
282b0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
282c0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
282d0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
282e0 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
282f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
28300 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
28310 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
28320 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
28330 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
28340 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
28350 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
28360 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
28370 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
28380 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
28390 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
283a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
283b0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
283c0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
283d0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
283e0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
283f0 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54  t, regAgg, SQLIT
28400 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
28410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
28420 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
28430 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
28440 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
28450 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
28460 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
28470 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
28480 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
28490 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
284a0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
284b0 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
284c0 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
284d0 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
284e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
284f0 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
28500 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
28510 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
28520 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
28530 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
28540 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
28550 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
28560 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
28570 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
28580 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
28590 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
285a0 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
285b0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
285c0 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
285d0 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
285e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
285f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
28600 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
28610 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
28620 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
28630 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
28640 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
28650 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
28660 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
28670 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
28680 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
28690 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
286a0 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
286b0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
286c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
286d0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
286e0 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
286f0 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
28700 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
28710 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28720 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
28730 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
28740 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
28760 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
28770 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
28780 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
28790 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
287a0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
287b0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
287c0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
287d0 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
287e0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
287f0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
28800 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
28810 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
28820 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
28830 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
28840 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
28850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
28860 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
28870 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
28880 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
28890 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
288a0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
288b0 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
288c0 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
288d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
288e0 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
288f0 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
28900 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
28910 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
28920 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
28930 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
28940 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
28950 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
28960 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
28970 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
28980 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
28990 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
289a0 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
289b0 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
289c0 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
289d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
289e0 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
289f0 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
28a00 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
28a10 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
28a20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
28a30 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
28a40 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
28a50 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
28a60 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
28a70 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
28a80 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
28a90 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
28aa0 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
28ab0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
28ac0 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
28ad0 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
28ae0 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
28af0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
28b00 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
28b10 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
28b20 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
28b30 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
28b40 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
28b50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
28b60 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
28b70 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
28b80 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
28b90 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
28ba0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
28bb0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
28bc0 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
28bd0 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
28be0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
28bf0 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
28c00 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
28c10 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
28c20 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
28c30 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
28c40 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
28c50 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
28c60 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
28c70 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
28c80 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
28c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
28ca0 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
28cb0 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
28cc0 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
28cd0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
28ce0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
28cf0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
28d00 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
28d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28d20 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
28d30 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
28d40 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
28d50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28d60 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
28d70 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
28d80 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
28d90 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
28da0 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72  {.    int bCover
28db0 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28   = (pIdx!=0 && (
28dc0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
28dd0 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
28de0 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20  ndex(pIdx)));.  
28df0 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
28e00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
28e10 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
28e20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
28e30 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
28e40 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  me,.        bCov
28e50 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56  er ? " USING COV
28e60 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20  ERING INDEX " : 
28e70 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76  "",.        bCov
28e80 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  er ? pIdx->zName
28e90 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20   : "".    );.   
28ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28eb0 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
28ec0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
28ed0 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
28ee0 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
28ef0 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
28f00 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
28f10 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
28f20 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
28f30 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
28f40 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
28f50 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
28f60 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
28f70 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
28f80 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
28f90 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
28fa0 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
28fb0 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
28fc0 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
28fd0 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
28fe0 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
28ff0 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
29000 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
29010 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
29020 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29030 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
29040 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
29050 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
29060 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
29070 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
29080 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
29090 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
290a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
290b0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
290c0 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
290d0 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
290e0 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
290f0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
29100 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
29110 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
29120 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
29130 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
29140 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
29150 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
29160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
29170 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
29180 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
29190 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
291a0 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
291b0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
291c0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
291d0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
291e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
291f0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
29200 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
29210 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
29220 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
29230 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
29240 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
29250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
29260 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
29270 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
29280 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
29290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
292a0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
292b0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
292c0 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
292d0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
292e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
292f0 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
29300 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
29310 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
29320 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
29330 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
29340 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
29350 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
29360 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
29370 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
29380 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
29390 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
293a0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
293b0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
293c0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
293d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
293e0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
293f0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
29400 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
29410 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
29420 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
29430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
29440 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
29450 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
29460 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
29470 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
29480 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74  eyword */.  Sort
29490 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20  Ctx sSort;      
294a0 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f     /* Info on ho
294b0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52  w to code the OR
294c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
294d0 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49  .  AggInfo sAggI
294e0 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66  nfo;      /* Inf
294f0 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79  ormation used by
29500 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
29510 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  es */.  int iEnd
29520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29530 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
29540 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72   end of the quer
29550 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
29560 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
29570 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
29580 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66  nnection */..#if
29590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
295a0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
295b0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20  RestoreSelectId 
295c0 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  = pParse->iSelec
295d0 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  tId;.  pParse->i
295e0 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
295f0 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
29600 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  ++;.#endif..  db
29610 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
29620 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d   if( p==0 || db-
29630 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
29640 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b   pParse->nErr ){
29650 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
29660 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
29670 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
29680 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
29690 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
296a0 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rn 1;.  memset(&
296b0 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  sAggInfo, 0, siz
296c0 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a  eof(sAggInfo));.
296d0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
296e0 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65  ENABLED.  pParse
296f0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b  ->nSelectIndent+
29700 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  +;.  SELECTTRACE
29710 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
29720 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
29730 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  \n"));.  if( sql
29740 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
29750 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73  & 0x100 ){.    s
29760 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
29770 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
29780 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
29790 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
297a0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
297b0 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66  est!=SRT_DistFif
297c0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
297d0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
297e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
297f0 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  RT_Fifo );.  ass
29800 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
29810 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
29820 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65  est!=SRT_DistQue
29830 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ue );.  assert( 
29840 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
29850 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
29860 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69  SRT_Queue );.  i
29870 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
29880 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
29890 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
298a0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
298b0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
298c0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
298d0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
298e0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
298f0 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
29900 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
29910 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  d ||.           
29920 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
29930 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73  T_Queue  || pDes
29940 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
29950 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20  stFifo ||.      
29960 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
29970 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
29980 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
29990 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20  ==SRT_Fifo);.   
299a0 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
299b0 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
299c0 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
299d0 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
299e0 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
299f0 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
29a00 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
29a10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29a20 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
29a30 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
29a40 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
29a50 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
29a60 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
29a70 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
29a80 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
29a90 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73  e, p, 0);.  mems
29aa0 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69  et(&sSort, 0, si
29ab0 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20  zeof(sSort));.  
29ac0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
29ad0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
29ae0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
29af0 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
29b00 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
29b10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
29b20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29b30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
29b40 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
29b50 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
29b60 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
29b70 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74  te)!=0;.  assert
29b80 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 23  ( pEList!=0 );.#
29b90 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
29ba0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
29bb0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
29bc0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
29bd0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
29be0 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
29bf0 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
29c00 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
29c10 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
29c20 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
29c30 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20  }.#endif...  /* 
29c40 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
29c50 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20   code..  */.  v 
29c60 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
29c70 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
29c80 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  v==0 ) goto sele
29c90 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66  ct_end;..  /* If
29ca0 20 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f   writing to memo
29cb0 72 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  ry or generating
29cc0 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79   a set.  ** only
29cd0 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
29ce0 20 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a   may be output..
29cf0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
29d00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
29d10 59 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72  Y.  if( checkFor
29d20 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
29d30 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  tError(pParse, p
29d40 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Dest, pEList->nE
29d50 78 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  xpr) ){.    goto
29d60 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
29d70 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
29d80 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
29d90 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
29da0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29db0 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  se.  */.#if !def
29dc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
29dd0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
29de0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
29df0 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
29e00 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
29e10 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
29e20 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
29e30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
29e40 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
29e50 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
29e60 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
29e70 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
29e80 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
29e90 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67  ct;.    int isAg
29ea0 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70  gSub;..    if( p
29eb0 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
29ec0 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74  e;..    /* Somet
29ed0 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  imes the code fo
29ee0 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c  r a subquery wil
29ef0 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  l be generated m
29f00 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ore than.    ** 
29f10 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62  once, if the sub
29f20 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
29f30 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29f40 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e in a LEFT JOIN
29f50 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61  ,.    ** for exa
29f60 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  mple.  In that c
29f70 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65  ase, do not rege
29f80 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
29f90 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20  to manifest.    
29fa0 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65  ** a view or the
29fb0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69   co-routine to i
29fc0 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e  mplement a view.
29fd0 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74    The first inst
29fe0 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  ance.    ** is s
29ff0 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67  ufficient, thoug
2a000 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  h the subroutine
2a010 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65   to manifest the
2a020 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a   view does need.
2a030 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
2a040 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  oked again. */. 
2a050 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
2a060 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
2a070 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 76 69     if( pItem->vi
2a080 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b  aCoroutine==0 ){
2a090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a0a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a0b0 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72  _Gosub, pItem->r
2a0c0 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  egReturn, pItem-
2a0d0 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
2a0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2a0f0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2a100 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
2a110 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
2a120 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
2a130 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
2a140 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
2a150 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
2a160 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
2a170 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
2a180 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
2a190 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
2a1a0 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
2a1b0 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
2a1c0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
2a1d0 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
2a1e0 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
2a1f0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
2a200 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
2a210 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
2a220 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
2a230 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
2a240 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
2a250 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
2a260 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
2a270 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
2a280 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2a290 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53  (p);..    isAggS
2a2a0 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46  ub = (pSub->selF
2a2b0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2a2c0 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ate)!=0;.    if(
2a2d0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
2a2e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
2a2f0 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20  sAgg, isAggSub) 
2a300 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2a310 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
2a320 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69   absorbed into i
2a330 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  ts parent. */.  
2a340 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
2a350 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
2a360 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
2a370 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2a380 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2a390 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
2a3a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2a3b0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
2a3c0 31 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  1.           && 
2a3d0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2a3e0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
2a3f0 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20  ubqCoroutine).  
2a400 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d    ){.      /* Im
2a410 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75  plement a co-rou
2a420 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
2a430 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72  eturn a single r
2a440 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2a450 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e  .      ** set on
2a460 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
2a470 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a480 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73   int addrTop = s
2a490 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2a4a0 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20  tAddr(v)+1;.    
2a4b0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2a4c0 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2a4d0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
2a4e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2a4f0 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
2a500 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2a510 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
2a520 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2a530 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
2a540 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2a550 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2a560 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
2a570 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
2a580 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
2a590 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
2a5a0 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2a5b0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2a5c0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2a5d0 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2a5e0 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2a5f0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2a600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2a610 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2a620 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2a630 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2a640 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
2a650 74 65 33 4c 6f 67 45 73 74 28 70 53 75 62 2d 3e  te3LogEst(pSub->
2a660 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
2a670 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72     pItem->viaCor
2a680 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
2a690 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
2a6a0 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
2a6b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a6c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
2a6d0 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  ndCoroutine, pIt
2a6e0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2a6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a700 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2a710 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
2a720 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2a730 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2a740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a750 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2a760 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2a770 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2a780 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2a790 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
2a7a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
2a7b0 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
2a7c0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
2a7d0 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
2a7e0 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
2a7f0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2a800 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
2a810 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
2a820 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
2a830 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
2a840 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
2a850 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
2a860 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
2a870 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
2a880 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2a890 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
2a8a0 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
2a8b0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
2a8c0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
2a8d0 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
2a8e0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
2a8f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2a900 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
2a910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a920 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2a930 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2a940 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
2a950 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
2a960 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
2a970 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72  if( pItem->isCor
2a980 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
2a990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2a9a0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
2a9b0 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69  correlated and i
2a9c0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73  f we are not ins
2a9d0 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ide of.        *
2a9e0 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65  * a trigger, the
2a9f0 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74  n we only need t
2aa00 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
2aa10 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  lue of the subqu
2aa20 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ery.        ** o
2aa30 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nce. */.        
2aa40 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74  onceAddr = sqlit
2aa50 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
2aa60 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
2aa70 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
2aa80 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
2aa90 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
2aaa0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2aab0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
2aac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
2aad0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
2aae0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
2aaf0 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
2ab00 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2ab10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2ab20 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
2ab30 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
2ab40 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
2ab50 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78  ursor);.      ex
2ab60 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2ab70 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2ab80 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2ab90 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2aba0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2abb0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2abc0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
2abd0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2abe0 6f 67 45 73 74 20 3d 20 73 71 6c 69 74 65 33 4c  ogEst = sqlite3L
2abf0 6f 67 45 73 74 28 70 53 75 62 2d 3e 6e 53 65 6c  ogEst(pSub->nSel
2ac00 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69  ectRow);.      i
2ac10 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
2ac20 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2ac30 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
2ac40 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
2ac50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ac60 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2ac70 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2ac80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ac90 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
2aca0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2acb0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
2acc0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2acd0 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
2ace0 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
2acf0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2ad00 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2ad10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 2f  .    }.    if( /
2ad20 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  *pParse->nErr ||
2ad30 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  */ db->mallocFai
2ad40 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  led ){.      got
2ad50 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2ad60 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
2ad70 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74  nHeight -= sqlit
2ad80 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
2ad90 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62 4c  ht(p);.    pTabL
2ada0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
2adb0 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c     if( !Ignorabl
2adc0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2add0 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  ){.      sSort.p
2ade0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
2adf0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
2ae00 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
2ae10 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20  EList;.#endif.  
2ae20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
2ae30 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
2ae40 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
2ae50 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
2ae60 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
2ae70 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
2ae80 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2ae90 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
2aea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2aeb0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
2aec0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2aed0 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
2aee0 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
2aef0 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
2af00 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
2af10 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2af20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
2af30 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
2af40 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
2af50 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
2af60 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2af70 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2af80 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2af90 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
2afa0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2afb0 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
2afc0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
2afd0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
2afe0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2aff0 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
2b000 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b010 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2b020 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2b030 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2b040 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2b050 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2b060 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2b070 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2b080 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2b090 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2b0a0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2b0b0 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2b0c0 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2b0d0 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2b0e0 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2b0f0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2b100 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2b110 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2b120 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2b130 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2b140 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2b150 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2b160 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2b170 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2b180 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2b190 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2b1a0 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2b1b0 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2b1c0 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2b1d0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2b1e0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2b1f0 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2b200 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2b210 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2b220 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2b230 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2b240 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2b250 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2b260 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2b270 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2b280 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2b290 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2b2a0 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2b2b0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2b2c0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2b2d0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2b2e0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2b2f0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2b300 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2b310 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 2d  ort.pOrderBy, p-
2b320 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a  >pEList, -1)==0.
2b330 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
2b340 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
2b350 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72  inct;.    p->pGr
2b360 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
2b370 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2b380 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  ->pEList, 0);.  
2b390 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2b3a0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 2f 2a  pGroupBy;.    /*
2b3b0 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
2b3c0 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
2b3d0 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
2b3e0 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
2b3f0 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
2b400 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
2b410 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
2b420 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
2b430 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2b440 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
2b450 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
2b460 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
2b470 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
2b480 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
2b490 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
2b4a0 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d  ct.isTnct );.  }
2b4b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2b4c0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2b4d0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73  lause, then this
2b4e0 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e   sorting.  ** in
2b4f0 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70  dex might end up
2b500 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66   being unused if
2b510 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65   the data can be
2b520 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64   .  ** extracted
2b530 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f   in pre-sorted o
2b540 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69  rder.  If that i
2b550 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
2b560 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65   the.  ** OP_Ope
2b570 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
2b580 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  uction will be c
2b590 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
2b5a0 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77  Noop once.  ** w
2b5b0 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
2b5c0 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
2b5d0 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65  dex is not neede
2b5e0 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74  d.  The addrSort
2b5f0 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61  Index.  ** varia
2b600 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
2b610 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63  acilitate that c
2b620 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
2b630 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
2b640 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
2b650 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
2b660 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
2b670 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2b680 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
2b690 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
2b6a0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
2b6b0 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
2b6c0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2b6d0 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
2b6e0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
2b6f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2b700 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2b710 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
2b720 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
2b730 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2b740 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
2b750 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
2b760 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
2b770 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
2b780 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
2b790 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
2b7a0 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
2b7b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2b7c0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
2b7d0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
2b7e0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
2b7f0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
2b800 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
2b810 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
2b820 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
2b830 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b840 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2b850 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
2b860 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2b870 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
2b880 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
2b890 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
2b8a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2b8b0 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
2b8c0 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
2b8d0 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
2b8e0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
2b8f0 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
2b900 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
2b910 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  & sSort.addrSort
2b920 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
2b930 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
2b940 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
2b950 72 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65  rtIndex)->opcode
2b960 20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e   = OP_SorterOpen
2b970 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
2b980 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
2b990 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
2b9a0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
2b9b0 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
2b9c0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
2b9d0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
2b9e0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2b9f0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2ba00 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
2ba10 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
2ba20 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
2ba30 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
2ba40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2ba50 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
2ba60 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
2ba90 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
2baa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bac0 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
2bad0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
2bae0 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
2baf0 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb10 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
2bb20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2bb30 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
2bb40 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
2bb50 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
2bb60 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
2bb70 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2bb80 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
2bb90 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2bba0 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
2bbb0 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
2bbc0 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
2bbd0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
2bbe0 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
2bbf0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
2bc00 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2bc10 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
2bc20 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
2bc30 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
2bc40 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
2bc50 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
2bc60 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
2bc70 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
2bc80 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2bc90 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2bca0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2bcb0 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
2bcc0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bce0 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
2bcf0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b   wctrlFlags, 0);
2bd00 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
2bd10 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2bd20 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
2bd30 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
2bd40 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
2bd50 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
2bd60 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
2bd70 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
2bd80 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
2bd90 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
2bda0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
2bdb0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
2bdc0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2bdd0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
2bde0 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
2bdf0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
2be00 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
2be10 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
2be20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72    }.    if( sSor
2be30 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  t.pOrderBy ){.  
2be40 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74      sSort.nOBSat
2be50 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
2be60 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2be70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
2be80 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
2be90 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
2bea0 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
2beb0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
2bec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2bed0 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
2bee0 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
2bef0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
2bf00 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
2bf10 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
2bf20 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
2bf30 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
2bf40 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
2bf50 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2bf60 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
2bf70 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
2bf80 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
2bf90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
2bfa0 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
2bfb0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
2bfc0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2bfd0 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
2bfe0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
2bff0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
2c000 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
2c010 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
2c020 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2c030 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
2c040 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2c050 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2c060 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2c070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2c080 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65  hereContinueLabe
2c090 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20  l(pWInfo),.     
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c0b0 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
2c0c0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
2c0d0 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
2c0e0 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
2c0f0 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
2c100 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2c110 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
2c120 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
2c130 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69  e when there exi
2c140 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  st aggregate fun
2c150 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55  ctions or a GROU
2c160 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  P BY clause.    
2c170 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20  ** or both */.  
2c180 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
2c190 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  C;    /* Name co
2c1a0 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73  ntext for proces
2c1b0 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69  sing aggregate i
2c1c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2c1d0 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20    int iAMem;    
2c1e0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
2c1f0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73  em address for s
2c200 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47  toring current G
2c210 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
2c220 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20  nt iBMem;       
2c230 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
2c240 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76  address for prev
2c250 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f  ious GROUP BY */
2c260 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61  .    int iUseFla
2c270 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20  g;       /* Mem 
2c280 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20  address holding 
2c290 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20  flag indicating 
2c2a0 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20  that at least.  
2c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2c0 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77        ** one row
2c2d0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f   of the input to
2c2e0 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20   the aggregator 
2c2f0 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20  has been.       
2c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c310 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   ** processed */
2c320 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46  .    int iAbortF
2c330 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20  lag;     /* Mem 
2c340 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61  address which ca
2c350 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74  uses query abort
2c360 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a   if positive */.
2c370 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53      int groupByS
2c380 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20  ort;    /* Rows 
2c390 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65  come from source
2c3a0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
2c3b0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  er */.    int ad
2c3c0 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a  drEnd;        /*
2c3d0 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69   End of processi
2c3e0 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ng for this SELE
2c3f0 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f  CT */.    int so
2c400 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a  rtPTab = 0;   /*
2c410 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65   Pseudotable use
2c420 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74  d to decode sort
2c430 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ing results */. 
2c440 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d     int sortOut =
2c450 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74   0;    /* Output
2c460 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74   register from t
2c470 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20  he sorter */.   
2c480 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20   int orderByGrp 
2c490 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
2c4a0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64  the GROUP BY and
2c4b0 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68   ORDER BY are th
2c4c0 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f  e same */..    /
2c4d0 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
2c4e0 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
2c4f0 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
2c500 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
2c510 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
2c520 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2c530 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
2c540 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2c570 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
2c580 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2c590 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
2c5a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
2c5b0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
2c5c0 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
2c5d0 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
2c5e0 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
2c5f0 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
2c600 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
2c610 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
2c620 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
2c630 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d    }.      for(k=
2c640 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
2c650 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d   pItem=pGroupBy-
2c660 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
2c670 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2c680 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
2c690 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
2c6a0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
2c6b0 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e  ectRow>100 ) p->
2c6c0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30  nSelectRow = 100
2c6d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c6e0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
2c6f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20   = 1;.    }...  
2c700 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2c710 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
2c720 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
2c730 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
2c740 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e   are.    ** iden
2c750 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  tical, then it m
2c760 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ay be possible t
2c770 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52  o disable the OR
2c780 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20  DER BY clause . 
2c790 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f     ** on the gro
2c7a0 75 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52  unds that the GR
2c7b0 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73  OUP BY will caus
2c7c0 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
2c7d0 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69  me out .    ** i
2c7e0 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
2c7f0 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79  der. It also may
2c800 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50   not - the GROUP
2c810 20 42 59 20 6d 61 79 20 75 73 65 20 61 0a 20 20   BY may use a.  
2c820 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
2c830 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
2c840 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
2c850 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
2c860 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
2c870 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
2c880 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
2c890 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
2c8a0 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
2c8b0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
2c8c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2c8d0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
2c8e0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
2c8f0 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
2c900 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
2c910 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2c920 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
2c930 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
2c940 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
2c950 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
2c960 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
2c970 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
2c980 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
2c990 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
2c9a0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
2c9b0 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
2c9c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2c9d0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
2c9e0 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
2c9f0 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
2ca00 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
2ca10 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
2ca20 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
2ca30 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
2ca40 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
2ca50 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
2ca60 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
2ca70 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
2ca80 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
2ca90 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
2caa0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
2cab0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2cac0 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
2cad0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
2cae0 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
2caf0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
2cb00 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20  AggInfo.mnReg = 
2cb10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
2cb20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f      sAggInfo.nSo
2cb30 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47  rtingColumn = pG
2cb40 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42  roupBy ? pGroupB
2cb50 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
2cb60 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75    sAggInfo.pGrou
2cb70 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2cb80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2cb90 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2cba0 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  NC, pEList);.   
2cbb0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
2cbc0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
2cbd0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29   sSort.pOrderBy)
2cbe0 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
2cbf0 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
2cc00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2cc10 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
2cc20 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
2cc30 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
2cc40 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
2cc50 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
2cc60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2cc70 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
2cc80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2cc90 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2cca0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2ccb0 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
2ccc0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2ccd0 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
2cce0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
2ccf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
2cd00 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
2cd10 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
2cd20 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
2cd30 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
2cd40 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
2cd50 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
2cd60 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
2cd70 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
2cd80 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
2cd90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2cda0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
2cdb0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
2cdc0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
2cdd0 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
2cde0 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2cdf0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2ce00 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2ce10 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2ce20 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2ce30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2ce40 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2ce50 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2ce60 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2ce70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2ce80 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2ce90 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2cea0 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
2ceb0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2cec0 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2ced0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2cee0 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2cef0 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2cf00 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2cf10 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2cf20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2cf30 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2cf40 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2cf50 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2cf60 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2cf70 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2cf80 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2cf90 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2cfa0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2cfb0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2cfc0 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2cfd0 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2cfe0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2cff0 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2d000 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2d010 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2d020 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2d030 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2d040 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2d050 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2d060 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2d070 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2d080 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2d090 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2d0a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2d0b0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2d0c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2d0d0 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2d0e0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2d0f0 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2d100 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2d110 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2d120 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2d130 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2d140 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2d150 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2d160 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2d170 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2d180 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2d190 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2d1a0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2d1b0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2d1c0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2d1d0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2d1e0 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2d1f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2d200 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2d210 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2d220 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2d230 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  y, 0, sAggInfo.n
2d240 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61  Column);.      a
2d250 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
2d260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d270 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
2d280 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  en, .          s
2d290 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2d2a0 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f  dx, sAggInfo.nSo
2d2b0 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20  rtingColumn, .  
2d2c0 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72          0, (char
2d2d0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2d2e0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
2d2f0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
2d300 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
2d310 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
2d320 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
2d330 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
2d340 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
2d350 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2d360 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
2d370 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2d380 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
2d390 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
2d3a0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2d3b0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2d3c0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2d3d0 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
2d3e0 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
2d3f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
2d400 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
2d410 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2d420 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
2d430 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2d440 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2d450 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2d460 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
2d470 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
2d480 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
2d490 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
2d4a0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
2d4b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d4c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2d4d0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
2d4e0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2d4f0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
2d500 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
2d510 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2d520 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2d530 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
2d540 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
2d550 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
2d560 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
2d570 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
2d580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d590 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2d5a0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
2d5b0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
2d5c0 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
2d5d0 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
2d5e0 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
2d5f0 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
2d600 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2d610 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
2d620 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
2d630 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
2d640 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
2d650 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
2d660 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2d670 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
2d680 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
2d690 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
2d6a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
2d6b0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
2d6c0 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
2d6d0 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
2d6e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d6f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2d700 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
2d710 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2d720 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2d730 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2d740 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2d750 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c  Where, pGroupBy,
2d760 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48   0,.          WH
2d770 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f  ERE_GROUPBY | (o
2d780 72 64 65 72 42 79 47 72 70 20 3f 20 57 48 45 52  rderByGrp ? WHER
2d790 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20  E_SORTBYGROUP : 
2d7a0 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  0), 0.      );. 
2d7b0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
2d7c0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2d7d0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
2d7e0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2d7f0 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70  dered(pWInfo)==p
2d800 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29  GroupBy->nExpr )
2d810 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2d820 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
2d830 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
2d840 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
2d850 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
2d860 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
2d870 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
2d880 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2d890 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
2d8a0 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
2d8b0 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
2d8c0 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
2d8d0 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
2d8e0 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
2d8f0 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
2d900 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
2d910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2d920 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
2d930 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
2d940 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
2d950 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
2d960 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
2d970 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
2d980 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
2d990 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
2d9a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2d9b0 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
2d9c0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
2d9d0 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
2d9e0 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
2d9f0 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
2da00 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
2da10 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
2da20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
2da30 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
2da40 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
2da50 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
2da60 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ..        explai
2da70 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2da80 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2da90 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
2daa0 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
2dab0 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d  s&SF_Distinct)==
2dac0 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  0) ?.           
2dad0 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
2dae0 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22  CT" : "GROUP BY"
2daf0 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75  );..        grou
2db00 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20  pBySort = 1;.   
2db10 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20       nGroupBy = 
2db20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2db30 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
2db40 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2db50 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
2db60 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2db70 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
2db80 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
2db90 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
2dba0 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
2dbb0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
2dbc0 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
2dbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
2dbe0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2dbf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dc00 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
2dc10 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2dc20 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
2dc30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2dc40 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2dc50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
2dc60 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
2dc70 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2dc80 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
2dc90 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  0);.        j = 
2dca0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
2dcb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2dcc0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2dcd0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2dce0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2dcf0 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
2dd00 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
2dd10 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2dd20 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
2dd30 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2dd40 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
2dd50 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
2dd60 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
2dd70 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
2dd80 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2dd90 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2ddc0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2ddd0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2dde0 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
2ddf0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2de00 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
2de10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2de20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2de30 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
2de40 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2de50 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2de60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2de70 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2de80 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2de90 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2dea0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2deb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2dec0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2ded0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2dee0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2def0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2df00 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2df10 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2df20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2df30 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2df40 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2df50 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2df60 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2df70 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2df80 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2df90 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2dfa0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2dfb0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2dfc0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2dfd0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2dfe0 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2dff0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2e000 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2e010 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2e020 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2e030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e040 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2e050 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2e060 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2e070 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2e080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2e090 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2e0a0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2e0b0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2e0c0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2e0d0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2e0e0 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
2e0f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2e100 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2e110 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2e120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2e130 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2e140 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
2e150 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2e160 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
2e170 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
2e180 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
2e190 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
2e1a0 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
2e1b0 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
2e1c0 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
2e1d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
2e1e0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
2e1f0 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
2e200 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
2e210 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
2e220 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e230 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2e240 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
2e250 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
2e260 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
2e270 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
2e280 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
2e290 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
2e2a0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2e2b0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
2e2c0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
2e2d0 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
2e2e0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
2e2f0 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
2e300 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
2e310 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
2e320 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2e330 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
2e340 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
2e350 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
2e360 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
2e370 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
2e380 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e390 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2e3a0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
2e3b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2e3c0 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
2e3d0 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
2e3e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
2e3f0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
2e400 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
2e410 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
2e420 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
2e430 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
2e440 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
2e450 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
2e460 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
2e470 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
2e480 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
2e490 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
2e4a0 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
2e4b0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
2e4c0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2e4d0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
2e4e0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
2e4f0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
2e500 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e510 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
2e520 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2e530 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2e540 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2e550 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2e560 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2e570 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2e580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e590 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
2e5a0 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
2e5b0 72 74 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75  rtingIdx, sortOu
2e5c0 74 2c 73 6f 72 74 50 54 61 62 29 3b 0a 20 20 20  t,sortPTab);.   
2e5d0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2e5e0 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
2e5f0 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
2e600 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
2e610 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
2e620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e630 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2e640 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
2e650 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2e660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e670 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
2e680 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
2e690 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2e6a0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
2e6b0 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
2e6c0 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
2e6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e6e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2e6f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
2e700 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
2e710 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2e720 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2e740 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
2e750 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
2e760 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
2e770 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
2e780 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2e790 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2e7a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2e7b0 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
2e7c0 30 2c 20 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f  0, j1+1); VdbeCo
2e7d0 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20  verage(v);..    
2e7e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
2e7f0 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
2e800 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
2e810 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
2e820 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
2e830 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
2e840 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
2e850 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
2e860 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
2e870 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
2e880 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
2e890 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
2e8a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e8b0 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
2e8c0 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
2e8d0 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
2e8e0 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
2e8f0 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
2e900 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
2e910 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
2e920 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2e930 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
2e940 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2e950 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2e960 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
2e970 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
2e980 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
2e990 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
2e9a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e9b0 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
2e9c0 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
2e9d0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2e9e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e9f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ea00 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2ea10 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2ea20 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2ea30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2ea40 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
2ea50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ea60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
2ea70 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
2ea80 20 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43   addrEnd); VdbeC
2ea90 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2eaa0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2eab0 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
2eac0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
2ead0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2eae0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2eaf0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
2eb00 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2eb10 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
2eb20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
2eb30 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2eb40 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
2eb50 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
2eb60 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
2eb70 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2eb80 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
2eb90 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2eba0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2ebb0 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
2ebc0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
2ebd0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2ebe0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
2ebf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ec00 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
2ec10 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
2ec20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ec30 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
2ec40 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
2ec50 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
2ec60 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
2ec70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
2ec80 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
2ec90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2eca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
2ecb0 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
2ecc0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
2ecd0 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
2ece0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2ecf0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
2ed00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ed10 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2ed20 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
2ed30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2ed40 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
2ed50 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
2ed60 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
2ed70 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
2ed80 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
2ed90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2eda0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2edb0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
2edc0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
2edd0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
2ede0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
2edf0 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
2ee00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
2ee10 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
2ee20 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
2ee30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2ee40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
2ee50 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a  o, 0, addrEnd);.
2ee60 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2ee70 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2ee80 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
2ee90 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2eea0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2eeb0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
2eec0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
2eed0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
2eee0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
2eef0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
2ef00 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
2ef10 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
2ef20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2ef30 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
2ef40 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
2ef50 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
2ef60 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
2ef70 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
2ef80 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
2ef90 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
2efa0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2efb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2efc0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
2efd0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
2efe0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
2eff0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2f000 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
2f010 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f020 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2f030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f040 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2f050 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
2f060 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2f070 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
2f080 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2f090 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f0a0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2f0b0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
2f0c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2f0d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2f0e0 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
2f0f0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
2f100 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
2f110 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2f120 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2f130 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f140 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
2f150 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
2f160 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
2f170 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
2f180 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
2f190 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2f1a0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
2f1b0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
2f1c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2f1d0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2f1e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2f1f0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2f200 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
2f210 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2f220 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2f230 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2f240 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
2f250 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
2f260 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2f270 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2f280 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2f290 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
2f2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f2b0 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
2f2c0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2e0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
2f2f0 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
2f300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f310 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2f320 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2f330 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2f340 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2f350 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
2f360 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
2f370 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2f380 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2f390 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
2f3a0 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
2f3b0 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
2f3c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f3d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2f3e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2f3f0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
2f400 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2f410 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2f420 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2f430 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2f440 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
2f450 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
2f460 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
2f470 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2f480 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
2f490 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
2f4a0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2f4b0 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
2f4c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
2f4d0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
2f4e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
2f4f0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
2f500 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
2f510 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
2f520 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
2f530 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
2f540 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
2f550 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
2f560 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
2f570 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
2f580 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
2f590 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
2f5a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2f5b0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2f5c0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
2f5d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2f5e0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
2f5f0 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
2f600 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
2f610 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
2f620 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2f630 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
2f640 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
2f650 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
2f660 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
2f670 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
2f680 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
2f690 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
2f6a0 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
2f6b0 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
2f6c0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2f6d0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
2f6e0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
2f6f0 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
2f700 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
2f710 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
2f720 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
2f730 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
2f740 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
2f750 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
2f760 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
2f770 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
2f780 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
2f790 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
2f7a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2f7b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
2f7c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2f7d0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2f7e0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2f7f0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
2f800 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
2f810 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
2f820 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
2f830 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
2f840 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f860 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2f870 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2f880 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
2f890 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f8b0 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
2f8c0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
2f8d0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
2f8e0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2f8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
2f900 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
2f910 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2f920 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
2f930 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
2f940 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
2f950 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
2f960 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
2f970 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2f980 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2f990 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
2f9a0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
2f9b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
2f9c0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
2f9d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
2f9e0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2f9f0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2fa00 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
2fa10 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
2fa20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2fa30 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
2fa40 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
2fa50 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
2fa60 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
2fa70 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2fa80 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
2fa90 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
2faa0 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
2fab0 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
2fac0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2fad0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
2fae0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2faf0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
2fb00 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
2fb10 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
2fb20 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
2fb30 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
2fb40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2fb50 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2fb60 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
2fb70 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2fb80 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2fb90 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
2fba0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
2fbb0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2fbc0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
2fbd0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
2fbe0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
2fbf0 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
2fc00 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
2fc10 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
2fc20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
2fc30 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
2fc40 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
2fc50 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
2fc60 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
2fc70 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2fc80 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
2fc90 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
2fca0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2fcb0 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
2fcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
2fcd0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
2fce0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
2fcf0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2fd00 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
2fd10 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
2fd20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2fd30 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
2fd40 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
2fd50 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
2fd60 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
2fd70 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
2fd80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2fd90 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
2fda0 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
2fdb0 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
2fdc0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
2fdd0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fde0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2fdf0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
2fe00 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2fe10 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
2fe20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2fe30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
2fe40 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
2fe50 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
2fe60 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
2fe70 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2fe80 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
2fe90 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
2fea0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
2feb0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
2fec0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
2fed0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2fee0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
2fef0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
2ff00 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
2ff10 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
2ff20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2ff30 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
2ff40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2ff50 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
2ff60 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
2ff70 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2ff80 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
2ff90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ffa0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
2ffb0 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
2ffc0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
2ffd0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
2ffe0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
2fff0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
30000 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
30010 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
30020 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
30030 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
30040 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
30050 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
30060 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
30070 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
30080 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
30090 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
300a0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
300b0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
300c0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
300d0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
300e0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
300f0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
30100 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
30110 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
30120 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
30130 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
30140 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
30150 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
30160 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
30170 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
30180 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
30190 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
301a0 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
301b0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
301c0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
301d0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
301e0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
301f0 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ior as follows:.
30200 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
30210 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
30220 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
30230 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
30240 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
30250 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
30260 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
30270 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
30280 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
30290 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
302a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
302b0 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
302c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
302d0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
302e0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
302f0 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
30300 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
30310 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
30320 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
30330 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
30340 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
30350 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
30360 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
30370 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
30380 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
30390 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
303a0 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
303b0 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
303c0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
303d0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
303e0 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
303f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
30400 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
30410 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
30420 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
30430 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  BY_NORMAL;.     
30440 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65     .        asse
30450 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
30460 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
30470 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b  sert( flag==0 );
30480 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
30490 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20  pHaving==0 ){.  
304a0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d          flag = m
304b0 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67  inMaxQuery(&sAgg
304c0 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b  Info, &pMinMax);
304d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
304e0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
304f0 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d  =0 || (pMinMax!=
30500 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 && pMinMax->nE
30510 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20  xpr==1) );..    
30520 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
30530 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
30540 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
30550 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d  istDup(db, pMinM
30560 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ax, 0);.        
30570 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
30580 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30590 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
305a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
305b0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
305c0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
305d0 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
305e0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
305f0 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
30600 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
30610 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
30620 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
30630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
30640 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
30650 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
30660 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
30670 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
30680 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
30690 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
306a0 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
306b0 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
306c0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
306d0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
306e0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
306f0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
30700 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
30710 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
30720 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
30730 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
30740 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
30750 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c  pWhere, pMinMax,
30760 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20  0,flag,0);.     
30770 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
30780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30790 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
307a0 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
307b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
307c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
307d0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
307e0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
307f0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
30800 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30810 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  ( pMinMax==0 || 
30820 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
30830 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
30840 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
30850 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30  rdered(pWInfo)>0
30860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30870 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
30880 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73  v, OP_Goto, 0, s
30890 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
308a0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
308b0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
308c0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
308d0 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
308e0 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
308f0 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
30900 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
30910 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
30920 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
30930 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
30940 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
30950 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
30960 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
30970 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
30980 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
30990 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
309a0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
309b0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
309c0 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
309d0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
309e0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
309f0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
30a00 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  List, -1, 0, 0, 
30a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30a20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64         pDest, ad
30a30 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b  drEnd, addrEnd);
30a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
30a50 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
30a60 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
30a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
30a80 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
30a90 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
30aa0 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
30ab0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69  te query */..  i
30ac0 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e  f( sDistinct.eTn
30ad0 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
30ae0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
30af0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
30b00 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
30b10 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20   "DISTINCT");.  
30b20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
30b30 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
30b40 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
30b50 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
30b60 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
30b70 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
30b80 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
30b90 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
30ba0 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
30bb0 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  y ){.    explain
30bc0 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65  TempTable(pParse
30bd0 2c 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30  , sSort.nOBSat>0
30be0 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f   ? "RIGHT PART O
30bf0 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44  F ORDER BY":"ORD
30c00 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e  ER BY");.    gen
30c10 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
30c20 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c  arse, p, &sSort,
30c30 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
30c40 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
30c50 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
30c60 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
30c70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
30c80 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
30c90 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
30ca0 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
30cb0 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72  n coded. If ther
30cc0 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  e is an error in
30cd0 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
30ce0 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74  ture,.  ** set t
30cf0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
30d00 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30  o 1. Otherwise 0
30d10 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61  . */.  rc = (pPa
30d20 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20  rse->nErr>0);.. 
30d30 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
30d40 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
30d50 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
30d60 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
30d70 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
30d80 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
30d90 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
30da0 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
30db0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
30dc0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
30dd0 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
30de0 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  Id);..  /* Ident
30df0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
30e00 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
30e10 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
30e20 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
30e30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30e40 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
30e50 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
30e60 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
30e70 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
30e80 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
30e90 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
30ea0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30eb0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
30ec0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
30ed0 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
30ee0 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  nc);.#if SELECTT
30ef0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53  RACE_ENABLED.  S
30f00 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
30f10 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63  rse,p,("end proc
30f20 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70  essing\n"));.  p
30f30 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e  Parse->nSelectIn
30f40 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20  dent--;.#endif. 
30f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
30f60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
30f70 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  UG./*.** Generat
30f80 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
30f90 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  le description o
30fa0 66 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f  f a the Select o
30fb0 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bject..*/.void s
30fc0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
30fd0 6c 65 63 74 28 54 72 65 65 56 69 65 77 20 2a 70  lect(TreeView *p
30fe0 56 69 65 77 2c 20 63 6f 6e 73 74 20 53 65 6c 65  View, const Sele
30ff0 63 74 20 2a 70 2c 20 75 38 20 6d 6f 72 65 54 6f  ct *p, u8 moreTo
31000 46 6f 6c 6c 6f 77 29 7b 0a 20 20 69 6e 74 20 6e  Follow){.  int n
31010 20 3d 20 30 3b 0a 20 20 70 56 69 65 77 20 3d 20   = 0;.  pView = 
31020 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
31030 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54  ush(pView, moreT
31040 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 73 71 6c 69  oFollow);.  sqli
31050 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
31060 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54 25 73  pView, "SELECT%s
31070 25 73 20 28 30 78 25 70 29 22 2c 0a 20 20 20 20  %s (0x%p)",.    
31080 28 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ((p->selFlags & 
31090 53 46 5f 44 69 73 74 69 6e 63 74 29 20 3f 20 22  SF_Distinct) ? "
310a0 20 44 49 53 54 49 4e 43 54 22 20 3a 20 22 22 29   DISTINCT" : "")
310b0 2c 0a 20 20 20 20 28 28 70 2d 3e 73 65 6c 46 6c  ,.    ((p->selFl
310c0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
310d0 74 65 29 20 3f 20 22 20 61 67 67 5f 66 6c 61 67  te) ? " agg_flag
310e0 22 20 3a 20 22 22 29 2c 20 70 0a 20 20 29 3b 0a  " : ""), p.  );.
310f0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26    if( p->pSrc &&
31100 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29   p->pSrc->nSrc )
31110 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
31120 57 68 65 72 65 20 29 20 6e 2b 2b 3b 0a 20 20 69  Where ) n++;.  i
31130 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
31140 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
31150 48 61 76 69 6e 67 20 29 20 6e 2b 2b 3b 0a 20 20  Having ) n++;.  
31160 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
31170 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  ) n++;.  if( p->
31180 70 4c 69 6d 69 74 20 29 20 6e 2b 2b 3b 0a 20 20  pLimit ) n++;.  
31190 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
311a0 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 70   n++;.  if( p->p
311b0 50 72 69 6f 72 20 29 20 6e 2b 2b 3b 0a 20 20 73  Prior ) n++;.  s
311c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
311d0 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 2d  prList(pView, p-
311e0 3e 70 45 4c 69 73 74 2c 20 28 6e 2d 2d 29 3e 30  >pEList, (n--)>0
311f0 2c 20 22 72 65 73 75 6c 74 2d 73 65 74 22 29 3b  , "result-set");
31200 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26  .  if( p->pSrc &
31210 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20  & p->pSrc->nSrc 
31220 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
31230 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74 65    pView = sqlite
31240 33 54 72 65 65 56 69 65 77 50 75 73 68 28 70 56  3TreeViewPush(pV
31250 69 65 77 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20  iew, (n--)>0);. 
31260 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31270 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 46  ewLine(pView, "F
31280 52 4f 4d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  ROM");.    for(i
31290 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
312a0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
312b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
312c0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
312d0 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
312e0 20 20 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a      StrAccum x;.
312f0 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
31300 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c  [100];.      sql
31310 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
31320 28 26 78 2c 20 7a 4c 69 6e 65 2c 20 73 69 7a 65  (&x, zLine, size
31330 6f 66 28 7a 4c 69 6e 65 29 2c 20 30 29 3b 0a 20  of(zLine), 0);. 
31340 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
31350 6e 74 66 28 26 78 2c 20 30 2c 20 22 7b 25 64 2c  ntf(&x, 0, "{%d,
31360 2a 7d 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  *}", pItem->iCur
31370 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
31380 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
31390 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
313a0 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30  te3XPrintf(&x, 0
313b0 2c 20 22 20 25 73 2e 25 73 22 2c 20 70 49 74 65  , " %s.%s", pIte
313c0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 49  m->zDatabase, pI
313d0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
313e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
313f0 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
31400 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
31410 6e 74 66 28 26 78 2c 20 30 2c 20 22 20 25 73 22  ntf(&x, 0, " %s"
31420 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
31430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31440 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
31450 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31460 33 58 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20  3XPrintf(&x, 0, 
31470 22 20 74 61 62 6e 61 6d 65 3d 25 51 22 2c 20 70  " tabname=%Q", p
31480 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
31490 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
314a0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
314b0 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ias ){.        s
314c0 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
314d0 2c 20 30 2c 20 22 20 28 41 53 20 25 73 29 22 2c  , 0, " (AS %s)",
314e0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
314f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31500 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  f( pItem->jointy
31510 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
31520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
31530 50 72 69 6e 74 66 28 26 78 2c 20 30 2c 20 22 20  Printf(&x, 0, " 
31540 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20  LEFT-JOIN");.   
31550 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
31560 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
31570 28 26 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (&x);.      sqli
31580 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
31590 70 56 69 65 77 2c 20 7a 4c 69 6e 65 2c 20 69 3c  pView, zLine, i<
315a0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31 29  p->pSrc->nSrc-1)
315b0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ; .      if( pIt
315c0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
315d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
315e0 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56 69  eeViewSelect(pVi
315f0 65 77 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  ew, pItem->pSele
31600 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ct, 0);.      }.
31610 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
31620 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
31630 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31640 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
31650 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  iew);.  }.  if( 
31660 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
31670 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
31680 49 74 65 6d 28 70 56 69 65 77 2c 20 22 57 48 45  Item(pView, "WHE
31690 52 45 22 2c 20 28 6e 2d 2d 29 3e 30 29 3b 0a 20  RE", (n--)>0);. 
316a0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
316b0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 2d  ewExpr(pView, p-
316c0 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
316d0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
316e0 50 6f 70 28 70 56 69 65 77 29 3b 0a 20 20 7d 0a  Pop(pView);.  }.
316f0 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42    if( p->pGroupB
31700 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
31710 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
31720 28 70 56 69 65 77 2c 20 70 2d 3e 70 47 72 6f 75  (pView, p->pGrou
31730 70 42 79 2c 20 28 6e 2d 2d 29 3e 30 2c 20 22 47  pBy, (n--)>0, "G
31740 52 4f 55 50 42 59 22 29 3b 0a 20 20 7d 0a 20 20  ROUPBY");.  }.  
31750 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
31760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
31770 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77 2c  eViewItem(pView,
31780 20 22 48 41 56 49 4e 47 22 2c 20 28 6e 2d 2d 29   "HAVING", (n--)
31790 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
317a0 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
317b0 65 77 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  ew, p->pHaving, 
317c0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  0);.    sqlite3T
317d0 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
317e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
317f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
31800 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
31810 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70  xprList(pView, p
31820 2d 3e 70 4f 72 64 65 72 42 79 2c 20 28 6e 2d 2d  ->pOrderBy, (n--
31830 29 3e 30 2c 20 22 4f 52 44 45 52 42 59 22 29 3b  )>0, "ORDERBY");
31840 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
31850 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
31860 74 65 33 54 72 65 65 56 69 65 77 49 74 65 6d 28  te3TreeViewItem(
31870 70 56 69 65 77 2c 20 22 4c 49 4d 49 54 22 2c 20  pView, "LIMIT", 
31880 28 6e 2d 2d 29 3e 30 29 3b 0a 20 20 20 20 73 71  (n--)>0);.    sq
31890 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
318a0 72 28 70 56 69 65 77 2c 20 70 2d 3e 70 4c 69 6d  r(pView, p->pLim
318b0 69 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  it, 0);.    sqli
318c0 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
318d0 56 69 65 77 29 3b 0a 20 20 7d 0a 20 20 69 66 28  View);.  }.  if(
318e0 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20   p->pOffset ){. 
318f0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31900 65 77 49 74 65 6d 28 70 56 69 65 77 2c 20 22 4f  ewItem(pView, "O
31910 46 46 53 45 54 22 2c 20 28 6e 2d 2d 29 3e 30 29  FFSET", (n--)>0)
31920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
31930 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
31940 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 30 29 3b   p->pOffset, 0);
31950 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31960 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
31970 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 50 72    }.  if( p->pPr
31980 69 6f 72 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ior ){.    const
31990 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 22 55 4e   char *zOp = "UN
319a0 49 4f 4e 22 3b 0a 20 20 20 20 73 77 69 74 63 68  ION";.    switch
319b0 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20  ( p->op ){.     
319c0 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
319d0 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 55 4e 49        zOp = "UNI
319e0 4f 4e 20 41 4c 4c 22 3b 20 20 62 72 65 61 6b 3b  ON ALL";  break;
319f0 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49  .      case TK_I
31a00 4e 54 45 52 53 45 43 54 3a 20 20 20 7a 4f 70 20  NTERSECT:   zOp 
31a10 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
31a20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
31a30 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
31a40 20 20 7a 4f 70 20 3d 20 22 45 58 43 45 50 54 22    zOp = "EXCEPT"
31a50 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
31a60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72   }.    sqlite3Tr
31a70 65 65 56 69 65 77 49 74 65 6d 28 70 56 69 65 77  eeViewItem(pView
31a80 2c 20 7a 4f 70 2c 20 28 6e 2d 2d 29 3e 30 29 3b  , zOp, (n--)>0);
31a90 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31aa0 56 69 65 77 53 65 6c 65 63 74 28 70 56 69 65 77  ViewSelect(pView
31ab0 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 30 29 3b  , p->pPrior, 0);
31ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31ad0 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
31ae0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 72 65    }.  sqlite3Tre
31af0 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
31b00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
31b10 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a           ITE_DEBUG */.